/*
 * Copyright (c) 2018 Tencent. All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
const AbstractModel = require("../../common/abstract_model");

/**
 * UpdateAlias request structure.
 * @class
 */
class UpdateAliasRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * New alias containing 1-60 characters or digits
         * @type {string || null}
         */
        this.Alias = null;

        /**
         * Globally unique CMK ID
         * @type {string || null}
         */
        this.KeyId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.Alias = 'Alias' in params ? params.Alias : null;
        this.KeyId = 'KeyId' in params ? params.KeyId : null;

    }
}

/**
 * EnableWhiteBoxKey request structure.
 * @class
 */
class EnableWhiteBoxKeyRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Globally unique white-box key ID
         * @type {string || null}
         */
        this.KeyId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.KeyId = 'KeyId' in params ? params.KeyId : null;

    }
}

/**
 * AsymmetricRsaDecrypt request structure.
 * @class
 */
class AsymmetricRsaDecryptRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Unique CMK ID
         * @type {string || null}
         */
        this.KeyId = null;

        /**
         * Base64-encoded ciphertext encrypted with `PublicKey`
         * @type {string || null}
         */
        this.Ciphertext = null;

        /**
         * Corresponding algorithm when a public key is used for encryption. Valid values: RSAES_PKCS1_V1_5, RSAES_OAEP_SHA_1, RSAES_OAEP_SHA_256
         * @type {string || null}
         */
        this.Algorithm = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.KeyId = 'KeyId' in params ? params.KeyId : null;
        this.Ciphertext = 'Ciphertext' in params ? params.Ciphertext : null;
        this.Algorithm = 'Algorithm' in params ? params.Algorithm : null;

    }
}

/**
 * EnableKeyRotation request structure.
 * @class
 */
class EnableKeyRotationRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Unique CMK ID
         * @type {string || null}
         */
        this.KeyId = null;

        /**
         * The interval between each key rotation in days. Value range: 7 - 365 (default).
         * @type {number || null}
         */
        this.RotateDays = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.KeyId = 'KeyId' in params ? params.KeyId : null;
        this.RotateDays = 'RotateDays' in params ? params.RotateDays : null;

    }
}

/**
 * DescribeWhiteBoxKeyDetails response structure.
 * @class
 */
class DescribeWhiteBoxKeyDetailsResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * White-box key information list
         * @type {Array.<WhiteboxKeyInfo> || null}
         */
        this.KeyInfos = null;

        /**
         * Total number of white-box keys.
         * @type {number || null}
         */
        this.TotalCount = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }

        if (params.KeyInfos) {
            this.KeyInfos = new Array();
            for (let z in params.KeyInfos) {
                let obj = new WhiteboxKeyInfo();
                obj.deserialize(params.KeyInfos[z]);
                this.KeyInfos.push(obj);
            }
        }
        this.TotalCount = 'TotalCount' in params ? params.TotalCount : null;
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * CreateKey request structure.
 * @class
 */
class CreateKeyRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Unique alias that makes a key more recognizable and understandable. This parameter cannot be empty, can contain 1-60 letters, digits, `-`, and `_`, and must begin with a letter or digit. The `kms-` prefix is used for Tencent Cloud products.
         * @type {string || null}
         */
        this.Alias = null;

        /**
         * CMK description of up to 1,024 bytes in length
         * @type {string || null}
         */
        this.Description = null;

        /**
         * Defines the purpose of the key. The valid values are as follows: `ENCRYPT_DECRYPT` (default): creates a symmetric encryption/decryption key; `ASYMMETRIC_DECRYPT_RSA_2048`: creates an asymmetric encryption/decryption 2048-bit RSA key; `ASYMMETRIC_DECRYPT_SM2`: creates an asymmetric encryption/decryption SM2 key; `ASYMMETRIC_SIGN_VERIFY_SM2`: creates an asymmetric SM2 key for signature verification; `ASYMMETRIC_SIGN_VERIFY_ECC`: creates an asymmetric 2048-bit RSA key for signature verification; `ASYMMETRIC_SIGN_VERIFY_ECDSA384`: creates an asymmetric ECDSA384 key for signature verification. You can get a full list of supported key purposes and algorithms using the ListAlgorithms API.
         * @type {string || null}
         */
        this.KeyUsage = null;

        /**
         * Specifies the key type. Default value: 1. Valid value: 1 - default type, indicating that the CMK is created by KMS; 2 - EXTERNAL type, indicating that you need to import key material. For more information, please see the `GetParametersForImport` and `ImportKeyMaterial` API documents.
         * @type {number || null}
         */
        this.Type = null;

        /**
         * Tag list
         * @type {Array.<Tag> || null}
         */
        this.Tags = null;

        /**
         * ID of the HSM cluster. This field is only valid for Exclusive and Managed KMS instances.
         * @type {string || null}
         */
        this.HsmClusterId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.Alias = 'Alias' in params ? params.Alias : null;
        this.Description = 'Description' in params ? params.Description : null;
        this.KeyUsage = 'KeyUsage' in params ? params.KeyUsage : null;
        this.Type = 'Type' in params ? params.Type : null;

        if (params.Tags) {
            this.Tags = new Array();
            for (let z in params.Tags) {
                let obj = new Tag();
                obj.deserialize(params.Tags[z]);
                this.Tags.push(obj);
            }
        }
        this.HsmClusterId = 'HsmClusterId' in params ? params.HsmClusterId : null;

    }
}

/**
 * DisableWhiteBoxKey response structure.
 * @class
 */
class DisableWhiteBoxKeyResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * DisableKey response structure.
 * @class
 */
class DisableKeyResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * DescribeWhiteBoxServiceStatus request structure.
 * @class
 */
class DescribeWhiteBoxServiceStatusRequest extends  AbstractModel {
    constructor(){
        super();

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }

    }
}

/**
 * UpdateDataKeyDescription request structure.
 * @class
 */
class UpdateDataKeyDescriptionRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Specifies the unique identifier of the data key.
         * @type {string || null}
         */
        this.DataKeyId = null;

        /**
         * Data key description of up to 100 bytes.
         * @type {string || null}
         */
        this.Description = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.DataKeyId = 'DataKeyId' in params ? params.DataKeyId : null;
        this.Description = 'Description' in params ? params.Description : null;

    }
}

/**
 * DescribeDataKey response structure.
 * @class
 */
class DescribeDataKeyResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * Specifies the data key attribute information.
         * @type {DataKeyMetadata || null}
         */
        this.DataKeyMetadata = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }

        if (params.DataKeyMetadata) {
            let obj = new DataKeyMetadata();
            obj.deserialize(params.DataKeyMetadata)
            this.DataKeyMetadata = obj;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * DisableDataKey response structure.
 * @class
 */
class DisableDataKeyResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * DescribeKey request structure.
 * @class
 */
class DescribeKeyRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Globally unique CMK ID
         * @type {string || null}
         */
        this.KeyId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.KeyId = 'KeyId' in params ? params.KeyId : null;

    }
}

/**
 * White-box key information
 * @class
 */
class WhiteboxKeyInfo extends  AbstractModel {
    constructor(){
        super();

        /**
         * Globally unique white-box key ID
         * @type {string || null}
         */
        this.KeyId = null;

        /**
         * Unique alias that makes a key more recognizable and understandable. This parameter cannot be empty, can contain 1 to 60 letters, digits, hyphens (-), and underscores (_), and must begin with a letter or digit.
         * @type {string || null}
         */
        this.Alias = null;

        /**
         * Creator
         * @type {number || null}
         */
        this.CreatorUin = null;

        /**
         * Key description information
         * @type {string || null}
         */
        this.Description = null;

        /**
         * Key creation time in Unix timestamp
         * @type {number || null}
         */
        this.CreateTime = null;

        /**
         * White-box key status. Valid values: Enabled, Disabled
         * @type {string || null}
         */
        this.Status = null;

        /**
         * Creator
         * @type {number || null}
         */
        this.OwnerUin = null;

        /**
         * Key algorithm type
         * @type {string || null}
         */
        this.Algorithm = null;

        /**
         * Base64-encoded white-box encryption key
         * @type {string || null}
         */
        this.EncryptKey = null;

        /**
         * Base64-encoded white-box decryption key
         * @type {string || null}
         */
        this.DecryptKey = null;

        /**
         * Resource ID in the format of `creatorUin/$creatorUin/$keyId`
         * @type {string || null}
         */
        this.ResourceId = null;

        /**
         * Specifies whether there is a device fingerprint bound to the current key.
         * @type {boolean || null}
         */
        this.DeviceFingerprintBind = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.KeyId = 'KeyId' in params ? params.KeyId : null;
        this.Alias = 'Alias' in params ? params.Alias : null;
        this.CreatorUin = 'CreatorUin' in params ? params.CreatorUin : null;
        this.Description = 'Description' in params ? params.Description : null;
        this.CreateTime = 'CreateTime' in params ? params.CreateTime : null;
        this.Status = 'Status' in params ? params.Status : null;
        this.OwnerUin = 'OwnerUin' in params ? params.OwnerUin : null;
        this.Algorithm = 'Algorithm' in params ? params.Algorithm : null;
        this.EncryptKey = 'EncryptKey' in params ? params.EncryptKey : null;
        this.DecryptKey = 'DecryptKey' in params ? params.DecryptKey : null;
        this.ResourceId = 'ResourceId' in params ? params.ResourceId : null;
        this.DeviceFingerprintBind = 'DeviceFingerprintBind' in params ? params.DeviceFingerprintBind : null;

    }
}

/**
 * DescribeDataKeys request structure.
 * @class
 */
class DescribeDataKeysRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Specifies the ID list of datakeys to query. supports up to 100 DataKey ids in a batch query.
         * @type {Array.<string> || null}
         */
        this.DataKeyIds = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.DataKeyIds = 'DataKeyIds' in params ? params.DataKeyIds : null;

    }
}

/**
 * ListAlgorithms response structure.
 * @class
 */
class ListAlgorithmsResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * Symmetric encryption algorithms supported in this region
         * @type {Array.<AlgorithmInfo> || null}
         */
        this.SymmetricAlgorithms = null;

        /**
         * Asymmetric encryption algorithms supported in this region
         * @type {Array.<AlgorithmInfo> || null}
         */
        this.AsymmetricAlgorithms = null;

        /**
         * Asymmetric signature verification algorithms supported in the current region
         * @type {Array.<AlgorithmInfo> || null}
         */
        this.AsymmetricSignVerifyAlgorithms = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }

        if (params.SymmetricAlgorithms) {
            this.SymmetricAlgorithms = new Array();
            for (let z in params.SymmetricAlgorithms) {
                let obj = new AlgorithmInfo();
                obj.deserialize(params.SymmetricAlgorithms[z]);
                this.SymmetricAlgorithms.push(obj);
            }
        }

        if (params.AsymmetricAlgorithms) {
            this.AsymmetricAlgorithms = new Array();
            for (let z in params.AsymmetricAlgorithms) {
                let obj = new AlgorithmInfo();
                obj.deserialize(params.AsymmetricAlgorithms[z]);
                this.AsymmetricAlgorithms.push(obj);
            }
        }

        if (params.AsymmetricSignVerifyAlgorithms) {
            this.AsymmetricSignVerifyAlgorithms = new Array();
            for (let z in params.AsymmetricSignVerifyAlgorithms) {
                let obj = new AlgorithmInfo();
                obj.deserialize(params.AsymmetricSignVerifyAlgorithms[z]);
                this.AsymmetricSignVerifyAlgorithms.push(obj);
            }
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * DisableKeys response structure.
 * @class
 */
class DisableKeysResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * EnableDataKey response structure.
 * @class
 */
class EnableDataKeyResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * DescribeWhiteBoxKey response structure.
 * @class
 */
class DescribeWhiteBoxKeyResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * White-box key information
         * @type {WhiteboxKeyInfo || null}
         */
        this.KeyInfo = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }

        if (params.KeyInfo) {
            let obj = new WhiteboxKeyInfo();
            obj.deserialize(params.KeyInfo)
            this.KeyInfo = obj;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * UpdateKeyDescription response structure.
 * @class
 */
class UpdateKeyDescriptionResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * DescribeWhiteBoxServiceStatus response structure.
 * @class
 */
class DescribeWhiteBoxServiceStatusResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * Whether the user's white-box key service is available
         * @type {boolean || null}
         */
        this.ServiceEnabled = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.ServiceEnabled = 'ServiceEnabled' in params ? params.ServiceEnabled : null;
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * AsymmetricRsaDecrypt response structure.
 * @class
 */
class AsymmetricRsaDecryptResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * Unique CMK ID
         * @type {string || null}
         */
        this.KeyId = null;

        /**
         * Base64-encoded plaintext after decryption
         * @type {string || null}
         */
        this.Plaintext = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.KeyId = 'KeyId' in params ? params.KeyId : null;
        this.Plaintext = 'Plaintext' in params ? params.Plaintext : null;
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * ScheduleDataKeyDeletion response structure.
 * @class
 */
class ScheduleDataKeyDeletionResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * Schedule deletion execution time.
         * @type {number || null}
         */
        this.DeletionDate = null;

        /**
         * Unique identifier of the data key scheduled for deletion.
         * @type {string || null}
         */
        this.DataKeyId = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.DeletionDate = 'DeletionDate' in params ? params.DeletionDate : null;
        this.DataKeyId = 'DataKeyId' in params ? params.DataKeyId : null;
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * EnableKey request structure.
 * @class
 */
class EnableKeyRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Unique CMK ID
         * @type {string || null}
         */
        this.KeyId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.KeyId = 'KeyId' in params ? params.KeyId : null;

    }
}

/**
 * GetKeyRotationStatus request structure.
 * @class
 */
class GetKeyRotationStatusRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Unique CMK ID
         * @type {string || null}
         */
        this.KeyId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.KeyId = 'KeyId' in params ? params.KeyId : null;

    }
}

/**
 * ListAlgorithms request structure.
 * @class
 */
class ListAlgorithmsRequest extends  AbstractModel {
    constructor(){
        super();

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }

    }
}

/**
 * Tag key and tag value
 * @class
 */
class Tag extends  AbstractModel {
    constructor(){
        super();

        /**
         * Tag key
         * @type {string || null}
         */
        this.TagKey = null;

        /**
         * Tag value
         * @type {string || null}
         */
        this.TagValue = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.TagKey = 'TagKey' in params ? params.TagKey : null;
        this.TagValue = 'TagValue' in params ? params.TagValue : null;

    }
}

/**
 * ListKeyDetail response structure.
 * @class
 */
class ListKeyDetailResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * Total number of CMKs
         * @type {number || null}
         */
        this.TotalCount = null;

        /**
         * Specifies the returned attribute information list.
         * @type {Array.<KeyMetadata> || null}
         */
        this.KeyMetadatas = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.TotalCount = 'TotalCount' in params ? params.TotalCount : null;

        if (params.KeyMetadatas) {
            this.KeyMetadatas = new Array();
            for (let z in params.KeyMetadatas) {
                let obj = new KeyMetadata();
                obj.deserialize(params.KeyMetadatas[z]);
                this.KeyMetadatas.push(obj);
            }
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * GenerateDataKey request structure.
 * @class
 */
class GenerateDataKeyRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Globally unique CMK ID
         * @type {string || null}
         */
        this.KeyId = null;

        /**
         * Specifies the encryption algorithm and size of the `DataKey`. Valid values: AES_128, AES_256. Either `KeySpec` or `NumberOfBytes` must be specified.
         * @type {string || null}
         */
        this.KeySpec = null;

        /**
         * Length of the `DataKey`. If both `NumberOfBytes` and `KeySpec` are specified, `NumberOfBytes` will prevail. Minimum value: 1; maximum value: 1024. Either `KeySpec` or `NumberOfBytes` must be specified.
         * @type {number || null}
         */
        this.NumberOfBytes = null;

        /**
         * JSON string of key-value pair. If this field is used, the same string should be entered when the returned `DataKey` is decrypted.
         * @type {string || null}
         */
        this.EncryptionContext = null;

        /**
         * PEM-encoded public key (2048-bit RSA/SM2 key), which can be used to encrypt the `Plaintext` returned. If this field is left empty, the `Plaintext` will not be encrypted.
         * @type {string || null}
         */
        this.EncryptionPublicKey = null;

        /**
         * Asymmetric encryption algorithm. Valid values: `SM2` (C1C3C2 ciphertext is returned)`, `SM2_C1C3C2_ASN1` (C1C3C2 ASN1 ciphertext is returned), `RSAES_PKCS1_V1_5`, `RSAES_OAEP_SHA_1`, and `RSAES_OAEP_SHA_256`. This field is used in combination with `EncryptionPublicKey` for encryption. If it is left empty, an SM2 public key will be used by default.
         * @type {string || null}
         */
        this.EncryptionAlgorithm = null;

        /**
         * Indicates whether the data generated key is managed by KMS. 1 means the key is managed and saved by KMS. 0 means the key is not managed by KMS.
         * @type {number || null}
         */
        this.IsHostedByKms = null;

        /**
         * Name of the data key. required when IsHostedByKms is 1. optional when IsHostedByKms is 0 as KMS does not manage it.
         * @type {string || null}
         */
        this.DataKeyName = null;

        /**
         * Describes the data key. maximum 100 bytes.
         * @type {string || null}
         */
        this.Description = null;

        /**
         * HSM cluster ID corresponding to the KMS exclusive edition. if HsmClusterId is specified, it indicates the root key is in this cluster and verifies whether KeyId corresponds to HsmClusterId.
         * @type {string || null}
         */
        this.HsmClusterId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.KeyId = 'KeyId' in params ? params.KeyId : null;
        this.KeySpec = 'KeySpec' in params ? params.KeySpec : null;
        this.NumberOfBytes = 'NumberOfBytes' in params ? params.NumberOfBytes : null;
        this.EncryptionContext = 'EncryptionContext' in params ? params.EncryptionContext : null;
        this.EncryptionPublicKey = 'EncryptionPublicKey' in params ? params.EncryptionPublicKey : null;
        this.EncryptionAlgorithm = 'EncryptionAlgorithm' in params ? params.EncryptionAlgorithm : null;
        this.IsHostedByKms = 'IsHostedByKms' in params ? params.IsHostedByKms : null;
        this.DataKeyName = 'DataKeyName' in params ? params.DataKeyName : null;
        this.Description = 'Description' in params ? params.Description : null;
        this.HsmClusterId = 'HsmClusterId' in params ? params.HsmClusterId : null;

    }
}

/**
 * UpdateAlias response structure.
 * @class
 */
class UpdateAliasResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * ScheduleKeyDeletion response structure.
 * @class
 */
class ScheduleKeyDeletionResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * Schedule deletion execution time
         * @type {number || null}
         */
        this.DeletionDate = null;

        /**
         * Unique ID of the CMK scheduled for deletion
         * @type {string || null}
         */
        this.KeyId = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.DeletionDate = 'DeletionDate' in params ? params.DeletionDate : null;
        this.KeyId = 'KeyId' in params ? params.KeyId : null;
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * PostQuantumCryptoVerify request structure.
 * @class
 */
class PostQuantumCryptoVerifyRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Unique ID of a key
         * @type {string || null}
         */
        this.KeyId = null;

        /**
         * Signature value, which is generated by calling the `PostQuantumCryptoSign` API.
         * @type {string || null}
         */
        this.SignatureValue = null;

        /**
         * Original message text before Base64 encoding. It cannot exceed 4096 bytes.
         * @type {string || null}
         */
        this.Message = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.KeyId = 'KeyId' in params ? params.KeyId : null;
        this.SignatureValue = 'SignatureValue' in params ? params.SignatureValue : null;
        this.Message = 'Message' in params ? params.Message : null;

    }
}

/**
 * GenerateRandom response structure.
 * @class
 */
class GenerateRandomResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * Base64-encoded plaintext of the randomly generated number. You need to Base64-decode it to get the plaintext.
         * @type {string || null}
         */
        this.Plaintext = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.Plaintext = 'Plaintext' in params ? params.Plaintext : null;
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * UpdateDataKeyName request structure.
 * @class
 */
class UpdateDataKeyNameRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Unique identifier of a data key.
         * @type {string || null}
         */
        this.DataKeyId = null;

        /**
         * Name of the data key.
         * @type {string || null}
         */
        this.DataKeyName = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.DataKeyId = 'DataKeyId' in params ? params.DataKeyId : null;
        this.DataKeyName = 'DataKeyName' in params ? params.DataKeyName : null;

    }
}

/**
 * ScheduleDataKeyDeletion request structure.
 * @class
 */
class ScheduleDataKeyDeletionRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Unique id of a data key.
         * @type {string || null}
         */
        this.DataKeyId = null;

        /**
         * Schedule deletion time range: [7,30].
         * @type {number || null}
         */
        this.PendingWindowInDays = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.DataKeyId = 'DataKeyId' in params ? params.DataKeyId : null;
        this.PendingWindowInDays = 'PendingWindowInDays' in params ? params.PendingWindowInDays : null;

    }
}

/**
 * DescribeKeys request structure.
 * @class
 */
class DescribeKeysRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * List of IDs of the CMKs to be queried in batches. Up to 100 `KeyId` values are supported in one query.
         * @type {Array.<string> || null}
         */
        this.KeyIds = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.KeyIds = 'KeyIds' in params ? params.KeyIds : null;

    }
}

/**
 * GetPublicKey request structure.
 * @class
 */
class GetPublicKeyRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Unique CMK ID.
         * @type {string || null}
         */
        this.KeyId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.KeyId = 'KeyId' in params ? params.KeyId : null;

    }
}

/**
 * GetServiceStatus request structure.
 * @class
 */
class GetServiceStatusRequest extends  AbstractModel {
    constructor(){
        super();

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }

    }
}

/**
 * EnableWhiteBoxKeys response structure.
 * @class
 */
class EnableWhiteBoxKeysResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * ArchiveKey response structure.
 * @class
 */
class ArchiveKeyResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * VerifyByAsymmetricKey response structure.
 * @class
 */
class VerifyByAsymmetricKeyResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * Whether the signature is valid. `true`: the signature is valid; `false`: the signature is invalid.
         * @type {boolean || null}
         */
        this.SignatureValid = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.SignatureValid = 'SignatureValid' in params ? params.SignatureValid : null;
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * DescribeDataKeys response structure.
 * @class
 */
class DescribeDataKeysResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * Response data key attribute information list.
         * @type {Array.<DataKeyMetadata> || null}
         */
        this.DataKeyMetadatas = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }

        if (params.DataKeyMetadatas) {
            this.DataKeyMetadatas = new Array();
            for (let z in params.DataKeyMetadatas) {
                let obj = new DataKeyMetadata();
                obj.deserialize(params.DataKeyMetadatas[z]);
                this.DataKeyMetadatas.push(obj);
            }
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * DescribeWhiteBoxKey request structure.
 * @class
 */
class DescribeWhiteBoxKeyRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Globally unique white-box key ID
         * @type {string || null}
         */
        this.KeyId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.KeyId = 'KeyId' in params ? params.KeyId : null;

    }
}

/**
 * GetParametersForImport response structure.
 * @class
 */
class GetParametersForImportResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * Unique ID of a CMK, which is used to specify the CMK into which to import key material.
         * @type {string || null}
         */
        this.KeyId = null;

        /**
         * The token required for importing key material, which is used as a parameter for `ImportKeyMaterial`.
         * @type {string || null}
         */
        this.ImportToken = null;

        /**
         * The Base64-encoded RSA public key used to encrypt key material before importing it with `ImportKeyMaterial`.
         * @type {string || null}
         */
        this.PublicKey = null;

        /**
         * Validity period of the token and public key. A token and public key can only be imported when they are valid. If they are expired, you will need to call the `GetParametersForImport` API again to get a new token and public key.
         * @type {number || null}
         */
        this.ParametersValidTo = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.KeyId = 'KeyId' in params ? params.KeyId : null;
        this.ImportToken = 'ImportToken' in params ? params.ImportToken : null;
        this.PublicKey = 'PublicKey' in params ? params.PublicKey : null;
        this.ParametersValidTo = 'ParametersValidTo' in params ? params.ParametersValidTo : null;
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * Decrypt response structure.
 * @class
 */
class DecryptResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * Globally unique CMK ID
         * @type {string || null}
         */
        this.KeyId = null;

        /**
         * If `EncryptionPublicKey` is left empty, a Base64-encoded ciphertext will be returned. To get the plaintext, you need to decode the ciphertext first.
If `EncryptionPublicKey` is specified, this field will return the Base64-encoded ciphertext encrypted with the specified public key. To get the plaintext, you need to decode the ciphertext and upload the corresponding private key.
         * @type {string || null}
         */
        this.Plaintext = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.KeyId = 'KeyId' in params ? params.KeyId : null;
        this.Plaintext = 'Plaintext' in params ? params.Plaintext : null;
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * ListDataKeyDetail response structure.
 * @class
 */
class ListDataKeyDetailResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * Returns the attribute information list.
         * @type {Array.<DataKeyMetadata> || null}
         */
        this.DataKeyMetadatas = null;

        /**
         * Total number of datakeys.
         * @type {number || null}
         */
        this.TotalCount = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }

        if (params.DataKeyMetadatas) {
            this.DataKeyMetadatas = new Array();
            for (let z in params.DataKeyMetadatas) {
                let obj = new DataKeyMetadata();
                obj.deserialize(params.DataKeyMetadatas[z]);
                this.DataKeyMetadatas.push(obj);
            }
        }
        this.TotalCount = 'TotalCount' in params ? params.TotalCount : null;
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * CreateWhiteBoxKey response structure.
 * @class
 */
class CreateWhiteBoxKeyResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * Base64-encoded encryption key
         * @type {string || null}
         */
        this.EncryptKey = null;

        /**
         * Base64-encoded decryption key
         * @type {string || null}
         */
        this.DecryptKey = null;

        /**
         * Globally unique white-box key ID
         * @type {string || null}
         */
        this.KeyId = null;

        /**
         * Return code of Tag operation. `0`: success; `1`: internal error; `2`: business processing error.
         * @type {number || null}
         */
        this.TagCode = null;

        /**
         * Response information of Tag operation.
         * @type {string || null}
         */
        this.TagMsg = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.EncryptKey = 'EncryptKey' in params ? params.EncryptKey : null;
        this.DecryptKey = 'DecryptKey' in params ? params.DecryptKey : null;
        this.KeyId = 'KeyId' in params ? params.KeyId : null;
        this.TagCode = 'TagCode' in params ? params.TagCode : null;
        this.TagMsg = 'TagMsg' in params ? params.TagMsg : null;
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * ImportKeyMaterial request structure.
 * @class
 */
class ImportKeyMaterialRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Base64-encoded key material that encrypted with the `PublicKey` returned by `GetParametersForImport`. For the KMS of SM-CRYPTO version, the length of the key material should be 128 bits, while for KMS of FIPS-compliant version, the length should be 256 bits.
         * @type {string || null}
         */
        this.EncryptedKeyMaterial = null;

        /**
         * Import token obtained by calling `GetParametersForImport`.
         * @type {string || null}
         */
        this.ImportToken = null;

        /**
         * Specifies the CMK into which to import key material, which must be the same as the one specified by `GetParametersForImport`.
         * @type {string || null}
         */
        this.KeyId = null;

        /**
         * Unix timestamp of the key material's expiration time. If this value is empty or 0, the key material will never expire. To specify the expiration time, it should be later than the current time. Maximum value: 2147443200.
         * @type {number || null}
         */
        this.ValidTo = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.EncryptedKeyMaterial = 'EncryptedKeyMaterial' in params ? params.EncryptedKeyMaterial : null;
        this.ImportToken = 'ImportToken' in params ? params.ImportToken : null;
        this.KeyId = 'KeyId' in params ? params.KeyId : null;
        this.ValidTo = 'ValidTo' in params ? params.ValidTo : null;

    }
}

/**
 * DeleteImportedKeyMaterial response structure.
 * @class
 */
class DeleteImportedKeyMaterialResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * EnableKeys request structure.
 * @class
 */
class EnableKeysRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * List of IDs of the CMKs to be enabled in batches. Up to 100 CMKs are supported at a time
         * @type {Array.<string> || null}
         */
        this.KeyIds = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.KeyIds = 'KeyIds' in params ? params.KeyIds : null;

    }
}

/**
 * EnableWhiteBoxKeys request structure.
 * @class
 */
class EnableWhiteBoxKeysRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * List of globally unique white-box key IDs. Note: you should make sure that all provided `KeyId` values are in valid format, unique, and actually exist. Up to 50 ones are allowed.
         * @type {Array.<string> || null}
         */
        this.KeyIds = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.KeyIds = 'KeyIds' in params ? params.KeyIds : null;

    }
}

/**
 * EncryptByWhiteBox response structure.
 * @class
 */
class EncryptByWhiteBoxResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * Base64-encoded initialization vector, which will be used by the encryption algorithm. If this parameter is passed in by the caller, it will be returned as-is; otherwise, the backend service will generate a random one and return it.
         * @type {string || null}
         */
        this.InitializationVector = null;

        /**
         * Base64-encoded ciphertext after encryption
         * @type {string || null}
         */
        this.CipherText = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.InitializationVector = 'InitializationVector' in params ? params.InitializationVector : null;
        this.CipherText = 'CipherText' in params ? params.CipherText : null;
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * UpdateDataKeyName response structure.
 * @class
 */
class UpdateDataKeyNameResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * DescribeKeys response structure.
 * @class
 */
class DescribeKeysResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The attribute information list returned.
         * @type {Array.<KeyMetadata> || null}
         */
        this.KeyMetadatas = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }

        if (params.KeyMetadatas) {
            this.KeyMetadatas = new Array();
            for (let z in params.KeyMetadatas) {
                let obj = new KeyMetadata();
                obj.deserialize(params.KeyMetadatas[z]);
                this.KeyMetadatas.push(obj);
            }
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * EnableWhiteBoxKey response structure.
 * @class
 */
class EnableWhiteBoxKeyResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * ListDataKeys response structure.
 * @class
 */
class ListDataKeysResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * Specifies the list array of data key ids.
         * @type {Array.<DataKey> || null}
         */
        this.DataKeys = null;

        /**
         * Total number of data keys.
         * @type {number || null}
         */
        this.TotalCount = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }

        if (params.DataKeys) {
            this.DataKeys = new Array();
            for (let z in params.DataKeys) {
                let obj = new DataKey();
                obj.deserialize(params.DataKeys[z]);
                this.DataKeys.push(obj);
            }
        }
        this.TotalCount = 'TotalCount' in params ? params.TotalCount : null;
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * ReEncrypt request structure.
 * @class
 */
class ReEncryptRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Ciphertext to be re-encrypted
         * @type {string || null}
         */
        this.CiphertextBlob = null;

        /**
         * CMK used for re-encryption. If this parameter is empty, the ciphertext will be re-encrypted by using the original CMK (as long as the key is not rotated, the ciphertext will not be refreshed)
         * @type {string || null}
         */
        this.DestinationKeyId = null;

        /**
         * JSON string of the key-value pair used during ciphertext encryption by `CiphertextBlob`. If not used during encryption, this parameter will be empty
         * @type {string || null}
         */
        this.SourceEncryptionContext = null;

        /**
         * JSON string of the key-value pair used during re-encryption. If this field is used, the same string should be entered when the returned new ciphertext is decrypted
         * @type {string || null}
         */
        this.DestinationEncryptionContext = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.CiphertextBlob = 'CiphertextBlob' in params ? params.CiphertextBlob : null;
        this.DestinationKeyId = 'DestinationKeyId' in params ? params.DestinationKeyId : null;
        this.SourceEncryptionContext = 'SourceEncryptionContext' in params ? params.SourceEncryptionContext : null;
        this.DestinationEncryptionContext = 'DestinationEncryptionContext' in params ? params.DestinationEncryptionContext : null;

    }
}

/**
 * ListKeys response structure.
 * @class
 */
class ListKeysResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * CMK list array.
         * @type {Array.<Key> || null}
         */
        this.Keys = null;

        /**
         * Total number of CMKs
         * @type {number || null}
         */
        this.TotalCount = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }

        if (params.Keys) {
            this.Keys = new Array();
            for (let z in params.Keys) {
                let obj = new Key();
                obj.deserialize(params.Keys[z]);
                this.Keys.push(obj);
            }
        }
        this.TotalCount = 'TotalCount' in params ? params.TotalCount : null;
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * Tag filter
 * @class
 */
class TagFilter extends  AbstractModel {
    constructor(){
        super();

        /**
         * Tag key
         * @type {string || null}
         */
        this.TagKey = null;

        /**
         * Tag value
         * @type {Array.<string> || null}
         */
        this.TagValue = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.TagKey = 'TagKey' in params ? params.TagKey : null;
        this.TagValue = 'TagValue' in params ? params.TagValue : null;

    }
}

/**
 * DescribeDataKey request structure.
 * @class
 */
class DescribeDataKeyRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Data key globally unique id.
         * @type {string || null}
         */
        this.DataKeyId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.DataKeyId = 'DataKeyId' in params ? params.DataKeyId : null;

    }
}

/**
 * AsymmetricSm2Decrypt response structure.
 * @class
 */
class AsymmetricSm2DecryptResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * Unique CMK ID
         * @type {string || null}
         */
        this.KeyId = null;

        /**
         * Base64-encoded plaintext after decryption
         * @type {string || null}
         */
        this.Plaintext = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.KeyId = 'KeyId' in params ? params.KeyId : null;
        this.Plaintext = 'Plaintext' in params ? params.Plaintext : null;
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * DisableKeyRotation response structure.
 * @class
 */
class DisableKeyRotationResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * Specifies the data key attribute information.
 * @class
 */
class DataKeyMetadata extends  AbstractModel {
    constructor(){
        super();

        /**
         * DataKey globally unique id.
         * @type {string || null}
         */
        this.DataKeyId = null;

        /**
         * Globally unique id of the CMK.
         * @type {string || null}
         */
        this.KeyId = null;

        /**
         * Key name as a more recognizable and understandable data key.
         * @type {string || null}
         */
        this.DataKeyName = null;

        /**
         * Specifies the length of the data key in bytes.
         * @type {number || null}
         */
        this.NumberOfBytes = null;

        /**
         * Key key creation time.
         * @type {number || null}
         */
        this.CreateTime = null;

        /**
         * DataKey description.
         * @type {string || null}
         */
        this.Description = null;

        /**
         * DataKey status. valid values: Enabled, Disabled, PendingDelete.
         * @type {string || null}
         */
        this.KeyState = null;

        /**
         * Creator.
         * @type {number || null}
         */
        this.CreatorUin = null;

        /**
         * Specifies the creator of the data key. valid values: user (user-created) or product name (auto-created by authorized cloud services).
         * @type {string || null}
         */
        this.Owner = null;

        /**
         * The time when schedule deletion.
         * @type {number || null}
         */
        this.DeletionDate = null;

        /**
         * Specifies the key material type of DataKey. valid values: TENCENT_KMS (created by KMS), EXTERNAL (user import).
         * @type {string || null}
         */
        this.Origin = null;

        /**
         * HSM cluster ID (only applicable to KMS exclusive/managed service instance).
         * @type {string || null}
         */
        this.HsmClusterId = null;

        /**
         * Resource ID in the format of `creatorUin/$creatorUin/$dataKeyId`.
         * @type {string || null}
         */
        this.ResourceId = null;

        /**
         * Whether the key is a primary replica. valid values: `0` (primary), `1` (synced replica).
         * @type {number || null}
         */
        this.IsSyncReplica = null;

        /**
         * Synchronous original region.
         * @type {string || null}
         */
        this.SourceRegion = null;

        /**
         * The state of key synchronization. valid values: 0 (unsynced), 1 (synchronization successful), 2 (synchronization failed), 3 (synchronizing).
         * @type {number || null}
         */
        this.SyncStatus = null;

        /**
         * Sresult description}.
         * @type {string || null}
         */
        this.SyncMessages = null;

        /**
         * Start time of synchronization.
         * @type {number || null}
         */
        this.SyncStartTime = null;

        /**
         * Specifies the synchronous end time.
         * @type {number || null}
         */
        this.SyncEndTime = null;

        /**
         * Synchronous original cluster. if empty, it is a public cloud public cluster.
         * @type {string || null}
         */
        this.SourceHsmClusterId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.DataKeyId = 'DataKeyId' in params ? params.DataKeyId : null;
        this.KeyId = 'KeyId' in params ? params.KeyId : null;
        this.DataKeyName = 'DataKeyName' in params ? params.DataKeyName : null;
        this.NumberOfBytes = 'NumberOfBytes' in params ? params.NumberOfBytes : null;
        this.CreateTime = 'CreateTime' in params ? params.CreateTime : null;
        this.Description = 'Description' in params ? params.Description : null;
        this.KeyState = 'KeyState' in params ? params.KeyState : null;
        this.CreatorUin = 'CreatorUin' in params ? params.CreatorUin : null;
        this.Owner = 'Owner' in params ? params.Owner : null;
        this.DeletionDate = 'DeletionDate' in params ? params.DeletionDate : null;
        this.Origin = 'Origin' in params ? params.Origin : null;
        this.HsmClusterId = 'HsmClusterId' in params ? params.HsmClusterId : null;
        this.ResourceId = 'ResourceId' in params ? params.ResourceId : null;
        this.IsSyncReplica = 'IsSyncReplica' in params ? params.IsSyncReplica : null;
        this.SourceRegion = 'SourceRegion' in params ? params.SourceRegion : null;
        this.SyncStatus = 'SyncStatus' in params ? params.SyncStatus : null;
        this.SyncMessages = 'SyncMessages' in params ? params.SyncMessages : null;
        this.SyncStartTime = 'SyncStartTime' in params ? params.SyncStartTime : null;
        this.SyncEndTime = 'SyncEndTime' in params ? params.SyncEndTime : null;
        this.SourceHsmClusterId = 'SourceHsmClusterId' in params ? params.SourceHsmClusterId : null;

    }
}

/**
 * VerifyByAsymmetricKey request structure.
 * @class
 */
class VerifyByAsymmetricKeyRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Unique ID of a key
         * @type {string || null}
         */
        this.KeyId = null;

        /**
         * Signature value, which is generated by calling the KMS signature API.
         * @type {string || null}
         */
        this.SignatureValue = null;

        /**
         * Full message or message abstract. Before Base64 encoding, an original message can contain up to 4,096 bytes while a message abstract must be 32 bytes.
         * @type {string || null}
         */
        this.Message = null;

        /**
         * Signature algorithm. The valid values include `SM2DSA`, `ECC_P256_R1`, `RSA_PSS_SHA_256`, and `RSA_PKCS1_SHA_256`, etc. You can get a full list of supported algorithms using the ListAlgorithms API.
         * @type {string || null}
         */
        this.Algorithm = null;

        /**
         * Message type. Valid values: `RAW` (indicating an original message; used by default if the parameter is not passed in) and `DIGEST`.
         * @type {string || null}
         */
        this.MessageType = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.KeyId = 'KeyId' in params ? params.KeyId : null;
        this.SignatureValue = 'SignatureValue' in params ? params.SignatureValue : null;
        this.Message = 'Message' in params ? params.Message : null;
        this.Algorithm = 'Algorithm' in params ? params.Algorithm : null;
        this.MessageType = 'MessageType' in params ? params.MessageType : null;

    }
}

/**
 * DisableWhiteBoxKeys request structure.
 * @class
 */
class DisableWhiteBoxKeysRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * List of globally unique white-box key IDs. Note: you should make sure that all provided `KeyId` values are in valid format, unique, and actually exist. Up to 50 ones are allowed.
         * @type {Array.<string> || null}
         */
        this.KeyIds = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.KeyIds = 'KeyIds' in params ? params.KeyIds : null;

    }
}

/**
 * ImportDataKey request structure.
 * @class
 */
class ImportDataKeyRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Name of the data key.
         * @type {string || null}
         */
        this.DataKeyName = null;

        /**
         * If the imported key is plaintext data key, it is the base64 plaintext data key after conversion. if the imported key is ciphertext data key, it is the ciphertext data key generated by the KMS GenerateDataKey interface.
         * @type {string || null}
         */
        this.ImportKeyMaterial = null;

        /**
         * 1: ciphertext import (data key generated by KMS api) 2: plaintext import.
         * @type {number || null}
         */
        this.ImportType = null;

        /**
         * Describes the data key. maximum 100 bytes.
         * @type {string || null}
         */
        this.Description = null;

        /**
         * When importing an encrypted data key, no need to input the root key. if the input is provided, validate whether the KeyId matches the one in the ciphertext.
When importing plaintext data key, KeyId cannot be empty. the data key is encrypted with the specified root key.
         * @type {string || null}
         */
        this.KeyId = null;

        /**
         * HSM cluster ID corresponding to the KMS exclusive edition. if HsmClusterId is specified, it indicates the root key is in this cluster and verifies whether KeyId corresponds to HsmClusterId.
         * @type {string || null}
         */
        this.HsmClusterId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.DataKeyName = 'DataKeyName' in params ? params.DataKeyName : null;
        this.ImportKeyMaterial = 'ImportKeyMaterial' in params ? params.ImportKeyMaterial : null;
        this.ImportType = 'ImportType' in params ? params.ImportType : null;
        this.Description = 'Description' in params ? params.Description : null;
        this.KeyId = 'KeyId' in params ? params.KeyId : null;
        this.HsmClusterId = 'HsmClusterId' in params ? params.HsmClusterId : null;

    }
}

/**
 * ListKeyDetail request structure.
 * @class
 */
class ListKeyDetailRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * This parameter has the same meaning of the `Offset` in an SQL query, indicating that this acquisition starts from the "No. Offset value" element of the array arranged in a certain order. The default value is 0.
         * @type {number || null}
         */
        this.Offset = null;

        /**
         * This parameter has the same meaning of the `Limit` in an SQL query, indicating that up to `Limit` value elements can be obtained in this request. The default value is 10 and the maximum value is 200.
         * @type {number || null}
         */
        this.Limit = null;

        /**
         * Filters by creator role. 0 (default value): the CMK is created by the user; 1: the CMK is created automatically by an authorized Tencent Cloud service.
         * @type {number || null}
         */
        this.Role = null;

        /**
         * Sorts by CMK creation time. 0: descending; 1: ascending
         * @type {number || null}
         */
        this.OrderType = null;

        /**
         * Filters by CMK status. 0: all CMKs; 1: CMKs in `Enabled` status only; 2: CMKs in `Disabled` status only; 3: CMKs in `PendingDelete` status only (i.e., keys with schedule deletion enabled); 4: CMKs in `PendingImport` status only; 5: CMKs in `Archived` status only.
         * @type {number || null}
         */
        this.KeyState = null;

        /**
         * Performs a fuzzy query by `KeyId` or `Alias`
         * @type {string || null}
         */
        this.SearchKeyAlias = null;

        /**
         * Filters by CMK type. "TENCENT_KMS" indicates to filter CMKs whose key materials are created by KMS; "EXTERNAL" indicates to filter CMKs of `EXTERNAL` type whose key materials are imported by users; "ALL" or empty indicates to filter CMKs of both types. This value is case-sensitive.
         * @type {string || null}
         */
        this.Origin = null;

        /**
         * Filters by the `KeyUsage` field value. Valid values: `ALL` (all CMKs), `ENCRYPT_DECRYPT` (used when this field is left empty), `ASYMMETRIC_DECRYPT_RSA_2048`, `ASYMMETRIC_DECRYPT_SM2`, `ASYMMETRIC_SIGN_VERIFY_SM2`, `ASYMMETRIC_SIGN_VERIFY_RSA_2048`, and `ASYMMETRIC_SIGN_VERIFY_ECC`.
         * @type {string || null}
         */
        this.KeyUsage = null;

        /**
         * Tag filter condition
         * @type {Array.<TagFilter> || null}
         */
        this.TagFilters = null;

        /**
         * ID of the HSM cluster. This field is only valid for Exclusive and Managed KMS instances.
         * @type {string || null}
         */
        this.HsmClusterId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.Offset = 'Offset' in params ? params.Offset : null;
        this.Limit = 'Limit' in params ? params.Limit : null;
        this.Role = 'Role' in params ? params.Role : null;
        this.OrderType = 'OrderType' in params ? params.OrderType : null;
        this.KeyState = 'KeyState' in params ? params.KeyState : null;
        this.SearchKeyAlias = 'SearchKeyAlias' in params ? params.SearchKeyAlias : null;
        this.Origin = 'Origin' in params ? params.Origin : null;
        this.KeyUsage = 'KeyUsage' in params ? params.KeyUsage : null;

        if (params.TagFilters) {
            this.TagFilters = new Array();
            for (let z in params.TagFilters) {
                let obj = new TagFilter();
                obj.deserialize(params.TagFilters[z]);
                this.TagFilters.push(obj);
            }
        }
        this.HsmClusterId = 'HsmClusterId' in params ? params.HsmClusterId : null;

    }
}

/**
 * DeleteWhiteBoxKey request structure.
 * @class
 */
class DeleteWhiteBoxKeyRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Globally unique white-box key ID
         * @type {string || null}
         */
        this.KeyId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.KeyId = 'KeyId' in params ? params.KeyId : null;

    }
}

/**
 * Algorithm name and ID
 * @class
 */
class AlgorithmInfo extends  AbstractModel {
    constructor(){
        super();

        /**
         * Algorithm ID
         * @type {string || null}
         */
        this.KeyUsage = null;

        /**
         * Algorithm name
         * @type {string || null}
         */
        this.Algorithm = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.KeyUsage = 'KeyUsage' in params ? params.KeyUsage : null;
        this.Algorithm = 'Algorithm' in params ? params.Algorithm : null;

    }
}

/**
 * GetRegions response structure.
 * @class
 */
class GetRegionsResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * Available region list.
         * @type {Array.<string> || null}
         */
        this.Regions = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.Regions = 'Regions' in params ? params.Regions : null;
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * UpdateDataKeyDescription response structure.
 * @class
 */
class UpdateDataKeyDescriptionResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * Exclusive edition cluster.
 * @class
 */
class ExclusiveHSM extends  AbstractModel {
    constructor(){
        super();

        /**
         * Dedicated cluster Id.
         * @type {string || null}
         */
        this.HsmClusterId = null;

        /**
         * Dedicated cluster name.
         * @type {string || null}
         */
        this.HsmClusterName = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.HsmClusterId = 'HsmClusterId' in params ? params.HsmClusterId : null;
        this.HsmClusterName = 'HsmClusterName' in params ? params.HsmClusterName : null;

    }
}

/**
 * CancelKeyDeletion request structure.
 * @class
 */
class CancelKeyDeletionRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Unique ID of the CMK for which to cancel schedule deletion
         * @type {string || null}
         */
        this.KeyId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.KeyId = 'KeyId' in params ? params.KeyId : null;

    }
}

/**
 * EnableDataKeys response structure.
 * @class
 */
class EnableDataKeysResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * GenerateDataKey response structure.
 * @class
 */
class GenerateDataKeyResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * Globally unique CMK ID
         * @type {string || null}
         */
        this.KeyId = null;

        /**
         * If `EncryptionPublicKey` is left empty, a Base64-encoded ciphertext will be returned. To get the plaintext, you need to decode the ciphertext first.
If `EncryptionPublicKey` is specified, this field will return the Base64-encoded ciphertext encrypted with the specified public key. To get the plaintext, you need to decode the ciphertext and upload the corresponding private key.
         * @type {string || null}
         */
        this.Plaintext = null;

        /**
         * Ciphertext of the data key, which should be kept by yourself. KMS does not host user data keys. You can call the `Decrypt` API to get the plaintext of the data key from `CiphertextBlob`.
         * @type {string || null}
         */
        this.CiphertextBlob = null;

        /**
         * Globally unique id of the data key, returned when KMS hosting is enabled.
         * @type {string || null}
         */
        this.DataKeyId = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.KeyId = 'KeyId' in params ? params.KeyId : null;
        this.Plaintext = 'Plaintext' in params ? params.Plaintext : null;
        this.CiphertextBlob = 'CiphertextBlob' in params ? params.CiphertextBlob : null;
        this.DataKeyId = 'DataKeyId' in params ? params.DataKeyId : null;
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * EnableDataKeys request structure.
 * @class
 */
class EnableDataKeysRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * The Id list of datakeys that need to be batch enabled supports a maximum of 100 data keys.
         * @type {Array.<string> || null}
         */
        this.DataKeyIds = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.DataKeyIds = 'DataKeyIds' in params ? params.DataKeyIds : null;

    }
}

/**
 * CreateWhiteBoxKey request structure.
 * @class
 */
class CreateWhiteBoxKeyRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Unique alias that makes a key more recognizable and understandable. This parameter should be 1 to 60 letters, digits, `-`, and `_`; it must begin with a letter or digit and cannot be left empty.
         * @type {string || null}
         */
        this.Alias = null;

        /**
         * All algorithm types for creating keys. Valid values: AES_256, SM4
         * @type {string || null}
         */
        this.Algorithm = null;

        /**
         * Key description of up to 1024 bytes
         * @type {string || null}
         */
        this.Description = null;

        /**
         * Tag list
         * @type {Array.<Tag> || null}
         */
        this.Tags = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.Alias = 'Alias' in params ? params.Alias : null;
        this.Algorithm = 'Algorithm' in params ? params.Algorithm : null;
        this.Description = 'Description' in params ? params.Description : null;

        if (params.Tags) {
            this.Tags = new Array();
            for (let z in params.Tags) {
                let obj = new Tag();
                obj.deserialize(params.Tags[z]);
                this.Tags.push(obj);
            }
        }

    }
}

/**
 * GetDataKeyPlaintext response structure.
 * @class
 */
class GetDataKeyPlaintextResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * If EncryptionPublicKey is not provided during the call, the field value is the plaintext encoded in Base64, and the Base64 decoding is required to obtain the plaintext. If EncryptionPublicKey is provided during the call, the field value is the ciphertext asymmetrically encrypted with the EncryptionPublicKey and encoded in Base64. After Base64 decoding, the private key corresponding to the user-uploaded public key is used for further decryption to obtain the plaintext.
         * @type {string || null}
         */
        this.Plaintext = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.Plaintext = 'Plaintext' in params ? params.Plaintext : null;
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * DisableDataKey request structure.
 * @class
 */
class DisableDataKeyRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Specifies the unique identifier of the data key.
         * @type {string || null}
         */
        this.DataKeyId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.DataKeyId = 'DataKeyId' in params ? params.DataKeyId : null;

    }
}

/**
 * OverwriteWhiteBoxDeviceFingerprints response structure.
 * @class
 */
class OverwriteWhiteBoxDeviceFingerprintsResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * DisableWhiteBoxKeys response structure.
 * @class
 */
class DisableWhiteBoxKeysResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * ArchiveKey request structure.
 * @class
 */
class ArchiveKeyRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Unique CMK ID
         * @type {string || null}
         */
        this.KeyId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.KeyId = 'KeyId' in params ? params.KeyId : null;

    }
}

/**
 * GetParametersForImport request structure.
 * @class
 */
class GetParametersForImportRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Unique ID of a CMK. The CMK for which to get the key parameters must be of the `EXTERNAL` type, i.e., Type = 2 when the CMK is created by the `CreateKey` API.
         * @type {string || null}
         */
        this.KeyId = null;

        /**
         * Specifies the algorithm for key material encryption. Currently, `RSAES_PKCS1_V1_5`, `RSAES_OAEP_SHA_1`, and `RSAES_OAEP_SHA_256` are supported.
         * @type {string || null}
         */
        this.WrappingAlgorithm = null;

        /**
         * Specifies the type of wrapping key. Currently, only `RSA_2048` is supported.
         * @type {string || null}
         */
        this.WrappingKeySpec = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.KeyId = 'KeyId' in params ? params.KeyId : null;
        this.WrappingAlgorithm = 'WrappingAlgorithm' in params ? params.WrappingAlgorithm : null;
        this.WrappingKeySpec = 'WrappingKeySpec' in params ? params.WrappingKeySpec : null;

    }
}

/**
 * CreateKey response structure.
 * @class
 */
class CreateKeyResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * Globally unique CMK ID
         * @type {string || null}
         */
        this.KeyId = null;

        /**
         * Alias that makes a key more recognizable and understandable
         * @type {string || null}
         */
        this.Alias = null;

        /**
         * Key creation time in UNIX timestamp format
         * @type {number || null}
         */
        this.CreateTime = null;

        /**
         * Specifies the description of the CMK.
         * @type {string || null}
         */
        this.Description = null;

        /**
         * CMK status
         * @type {string || null}
         */
        this.KeyState = null;

        /**
         * CMK usage
         * @type {string || null}
         */
        this.KeyUsage = null;

        /**
         * Return code of Tag operation. `0`: success; `1`: cls internal error; `2`: business processing error.
         * @type {number || null}
         */
        this.TagCode = null;

        /**
         * Response information of Tag operation.
         * @type {string || null}
         */
        this.TagMsg = null;

        /**
         * HSM cluster ID (valid only for exclusive or managed version KMS service instances).
         * @type {string || null}
         */
        this.HsmClusterId = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.KeyId = 'KeyId' in params ? params.KeyId : null;
        this.Alias = 'Alias' in params ? params.Alias : null;
        this.CreateTime = 'CreateTime' in params ? params.CreateTime : null;
        this.Description = 'Description' in params ? params.Description : null;
        this.KeyState = 'KeyState' in params ? params.KeyState : null;
        this.KeyUsage = 'KeyUsage' in params ? params.KeyUsage : null;
        this.TagCode = 'TagCode' in params ? params.TagCode : null;
        this.TagMsg = 'TagMsg' in params ? params.TagMsg : null;
        this.HsmClusterId = 'HsmClusterId' in params ? params.HsmClusterId : null;
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * ReEncrypt response structure.
 * @class
 */
class ReEncryptResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * Re-encrypted ciphertext
         * @type {string || null}
         */
        this.CiphertextBlob = null;

        /**
         * CMK used for re-encryption
         * @type {string || null}
         */
        this.KeyId = null;

        /**
         * CMK used by ciphertext before re-encryption
         * @type {string || null}
         */
        this.SourceKeyId = null;

        /**
         * `true` indicates that the ciphertext has been re-encrypted. When re-encryption is initiated by using the same CMK, as long as the CMK is not rotated, no actual re-encryption will be performed, and the original ciphertext will be returned
         * @type {boolean || null}
         */
        this.ReEncrypted = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.CiphertextBlob = 'CiphertextBlob' in params ? params.CiphertextBlob : null;
        this.KeyId = 'KeyId' in params ? params.KeyId : null;
        this.SourceKeyId = 'SourceKeyId' in params ? params.SourceKeyId : null;
        this.ReEncrypted = 'ReEncrypted' in params ? params.ReEncrypted : null;
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * Encrypt response structure.
 * @class
 */
class EncryptResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * Base64-encoded ciphertext, which is the encrypted information of the ciphertext and key. To get the plaintext, you need to pass in this field to the Decrypt API.
         * @type {string || null}
         */
        this.CiphertextBlob = null;

        /**
         * Globally unique ID of the CMK used for encryption
         * @type {string || null}
         */
        this.KeyId = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.CiphertextBlob = 'CiphertextBlob' in params ? params.CiphertextBlob : null;
        this.KeyId = 'KeyId' in params ? params.KeyId : null;
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * GetDataKeyPlaintext request structure.
 * @class
 */
class GetDataKeyPlaintextRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Unique id of a data key.
         * @type {string || null}
         */
        this.DataKeyId = null;

        /**
         * PEM formatted public key string, supporting RSA2048 and SM2 public keys, and used to encrypt the plaintext value in the returned data. If it is empty, plaintext value will not be encrypted.
         * @type {string || null}
         */
        this.EncryptionPublicKey = null;

        /**
         * Asymmetric encryption algorithm, used in conjunction with EncryptionPublicKey to encrypt the returned data. It currently supports SM2 (returns ciphertext in C1C3C2 format), SM2_C1C3C2_ASN1 (returns ciphertext in C1C3C2 ASN1 format), RSAES_PKCS1_V1_5, RSAES_OAEP_SHA_1, and RSAES_OAEP_SHA_256. If it is empty, the default value SM2 is used.
         * @type {string || null}
         */
        this.EncryptionAlgorithm = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.DataKeyId = 'DataKeyId' in params ? params.DataKeyId : null;
        this.EncryptionPublicKey = 'EncryptionPublicKey' in params ? params.EncryptionPublicKey : null;
        this.EncryptionAlgorithm = 'EncryptionAlgorithm' in params ? params.EncryptionAlgorithm : null;

    }
}

/**
 * GetDataKeyCiphertextBlob request structure.
 * @class
 */
class GetDataKeyCiphertextBlobRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Unique id of a data key.
         * @type {string || null}
         */
        this.DataKeyId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.DataKeyId = 'DataKeyId' in params ? params.DataKeyId : null;

    }
}

/**
 * DeleteImportedKeyMaterial request structure.
 * @class
 */
class DeleteImportedKeyMaterialRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Specifies the EXTERNAL CMK for which to delete the key material.
         * @type {string || null}
         */
        this.KeyId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.KeyId = 'KeyId' in params ? params.KeyId : null;

    }
}

/**
 * EnableKey response structure.
 * @class
 */
class EnableKeyResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * ImportDataKey response structure.
 * @class
 */
class ImportDataKeyResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * Globally unique CMK id.
         * @type {string || null}
         */
        this.KeyId = null;

        /**
         * Globally unique id of DataKey. no. show on portal/domestic and international sites.
         * @type {string || null}
         */
        this.DataKeyId = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.KeyId = 'KeyId' in params ? params.KeyId : null;
        this.DataKeyId = 'DataKeyId' in params ? params.DataKeyId : null;
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * GetServiceStatus response structure.
 * @class
 */
class GetServiceStatusResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * Whether the KMS service has been activated. true: activated
         * @type {boolean || null}
         */
        this.ServiceEnabled = null;

        /**
         * Service unavailability type: 0-not purchased, 1-normal, 2-service suspended due to overdue payments, 3-resource release.
         * @type {number || null}
         */
        this.InvalidType = null;

        /**
         * 0: Basic Edition, 1: Ultimate Edition
         * @type {number || null}
         */
        this.UserLevel = null;

        /**
         * Specifies the expiry time (Epoch Unix Timestamp) of the flagship edition.
         * @type {number || null}
         */
        this.ProExpireTime = null;

        /**
         * Specifies whether the flagship edition is automatically renewed: 0 - no automatic renewal, 1 - automatic renewal.
         * @type {number || null}
         */
        this.ProRenewFlag = null;

        /**
         * Flagship edition purchase record unique identifier. if not activated, the return value is empty.
         * @type {string || null}
         */
        this.ProResourceId = null;

        /**
         * Whether to enable the KMS-managed version.
         * @type {boolean || null}
         */
        this.ExclusiveVSMEnabled = null;

        /**
         * Whether to enable the exclusive edition of KMS.
         * @type {boolean || null}
         */
        this.ExclusiveHSMEnabled = null;

        /**
         * Specifies the KMS subscription information.
         * @type {string || null}
         */
        this.SubscriptionInfo = null;

        /**
         * Returns the amount of KMS user secret keys used.
         * @type {number || null}
         */
        this.CmkUserCount = null;

        /**
         * Returns the specification quantity of KMS user secret keys.
         * @type {number || null}
         */
        this.CmkLimit = null;

        /**
         * Return dedicated cluster group.
         * @type {Array.<ExclusiveHSM> || null}
         */
        this.ExclusiveHSMList = null;

        /**
         * Whether data key management is supported. valid values: 1 (supported), 0 (unsupported).
         * @type {boolean || null}
         */
        this.IsAllowedDataKeyHosted = null;

        /**
         * Valid when IsAllowedDataKeyHosted is 1. specifies the purchase quota for data keys.
         * @type {number || null}
         */
        this.DataKeyLimit = null;

        /**
         * Valid when IsAllowedDataKeyHosted is 1. data key free quota.
         * @type {number || null}
         */
        this.FreeDataKeyLimit = null;

        /**
         * Valid at that time when IsAllowedDataKeyHosted is 1. specifies the number of keys used.
         * @type {number || null}
         */
        this.DataKeyUsedCount = null;

        /**
         * Specifies the target region of the sync task.
         * @type {Array.<DestinationSyncConfig> || null}
         */
        this.SyncTaskList = null;

        /**
         * Whether synchronization task is supported. true: supported; false: unsupported.
         * @type {boolean || null}
         */
        this.IsAllowedSync = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.ServiceEnabled = 'ServiceEnabled' in params ? params.ServiceEnabled : null;
        this.InvalidType = 'InvalidType' in params ? params.InvalidType : null;
        this.UserLevel = 'UserLevel' in params ? params.UserLevel : null;
        this.ProExpireTime = 'ProExpireTime' in params ? params.ProExpireTime : null;
        this.ProRenewFlag = 'ProRenewFlag' in params ? params.ProRenewFlag : null;
        this.ProResourceId = 'ProResourceId' in params ? params.ProResourceId : null;
        this.ExclusiveVSMEnabled = 'ExclusiveVSMEnabled' in params ? params.ExclusiveVSMEnabled : null;
        this.ExclusiveHSMEnabled = 'ExclusiveHSMEnabled' in params ? params.ExclusiveHSMEnabled : null;
        this.SubscriptionInfo = 'SubscriptionInfo' in params ? params.SubscriptionInfo : null;
        this.CmkUserCount = 'CmkUserCount' in params ? params.CmkUserCount : null;
        this.CmkLimit = 'CmkLimit' in params ? params.CmkLimit : null;

        if (params.ExclusiveHSMList) {
            this.ExclusiveHSMList = new Array();
            for (let z in params.ExclusiveHSMList) {
                let obj = new ExclusiveHSM();
                obj.deserialize(params.ExclusiveHSMList[z]);
                this.ExclusiveHSMList.push(obj);
            }
        }
        this.IsAllowedDataKeyHosted = 'IsAllowedDataKeyHosted' in params ? params.IsAllowedDataKeyHosted : null;
        this.DataKeyLimit = 'DataKeyLimit' in params ? params.DataKeyLimit : null;
        this.FreeDataKeyLimit = 'FreeDataKeyLimit' in params ? params.FreeDataKeyLimit : null;
        this.DataKeyUsedCount = 'DataKeyUsedCount' in params ? params.DataKeyUsedCount : null;

        if (params.SyncTaskList) {
            this.SyncTaskList = new Array();
            for (let z in params.SyncTaskList) {
                let obj = new DestinationSyncConfig();
                obj.deserialize(params.SyncTaskList[z]);
                this.SyncTaskList.push(obj);
            }
        }
        this.IsAllowedSync = 'IsAllowedSync' in params ? params.IsAllowedSync : null;
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * Device fingerprint
 * @class
 */
class DeviceFingerprint extends  AbstractModel {
    constructor(){
        super();

        /**
         * Fingerprint information collected by device fingerprint collector. Its format must be in the following regular expression: ^[0-9a-f]{8}[\-][0-9a-f]{14}[\-][0-9a-f]{14}[\-][0-9a-f]{14}[\-][0-9a-f]{16}$
         * @type {string || null}
         */
        this.Identity = null;

        /**
         * Description information, such as IP and device name, with a maximum of 1024 bytes.
         * @type {string || null}
         */
        this.Description = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.Identity = 'Identity' in params ? params.Identity : null;
        this.Description = 'Description' in params ? params.Description : null;

    }
}

/**
 * GetKeyRotationStatus response structure.
 * @class
 */
class GetKeyRotationStatusResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * Whether key rotation is enabled
         * @type {boolean || null}
         */
        this.KeyRotationEnabled = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.KeyRotationEnabled = 'KeyRotationEnabled' in params ? params.KeyRotationEnabled : null;
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * Encrypt request structure.
 * @class
 */
class EncryptRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Globally unique ID of the CMK generated by calling the `CreateKey` API
         * @type {string || null}
         */
        this.KeyId = null;

        /**
         * Encrypted plaintext data. This field must be Base64-encoded. The maximum size of the original data is 4 KB
         * @type {string || null}
         */
        this.Plaintext = null;

        /**
         * JSON string of key-value pair. If this parameter is specified, the same parameter needs to be provided when the `Decrypt` API is called. It is up to 1,024 characters
         * @type {string || null}
         */
        this.EncryptionContext = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.KeyId = 'KeyId' in params ? params.KeyId : null;
        this.Plaintext = 'Plaintext' in params ? params.Plaintext : null;
        this.EncryptionContext = 'EncryptionContext' in params ? params.EncryptionContext : null;

    }
}

/**
 * AsymmetricSm2Decrypt request structure.
 * @class
 */
class AsymmetricSm2DecryptRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Unique CMK ID
         * @type {string || null}
         */
        this.KeyId = null;

        /**
         * Specifies that the ciphertext encrypted with PublicKey is Base64 encoded. the original ciphertext format needs to be C1C3C2_ASN1. the length of the original ciphertext cannot exceed 256 bytes.
         * @type {string || null}
         */
        this.Ciphertext = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.KeyId = 'KeyId' in params ? params.KeyId : null;
        this.Ciphertext = 'Ciphertext' in params ? params.Ciphertext : null;

    }
}

/**
 * ListDataKeys request structure.
 * @class
 */
class ListDataKeysRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Meaning matches the Offset in SQL queries, indicates the retrieval starts from the Offset-th element in a sequentially arranged array, defaults to 0.
         * @type {number || null}
         */
        this.Offset = null;

        /**
         * Specifies the maximum number of elements to retrieve, same as the Limit in SQL queries. default value is 10. maximum value is 200.
         * @type {number || null}
         */
        this.Limit = null;

        /**
         * Filter criteria based on the creator role. default 0 means data key created by oneself, 1 means data key automatically created by other cloud services.
         * @type {number || null}
         */
        this.Role = null;

        /**
         * HSM cluster ID corresponding to KMS advanced edition (only applicable to KMS exclusive/managed service instance).
         * @type {string || null}
         */
        this.HsmClusterId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.Offset = 'Offset' in params ? params.Offset : null;
        this.Limit = 'Limit' in params ? params.Limit : null;
        this.Role = 'Role' in params ? params.Role : null;
        this.HsmClusterId = 'HsmClusterId' in params ? params.HsmClusterId : null;

    }
}

/**
 * DeleteWhiteBoxKey response structure.
 * @class
 */
class DeleteWhiteBoxKeyResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * ListDataKeyDetail request structure.
 * @class
 */
class ListDataKeyDetailRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Meaning matches the Offset in SQL queries, indicates the retrieval starts from the Offset-th element in a sequentially arranged array, defaults to 0.
         * @type {number || null}
         */
        this.Offset = null;

        /**
         * Specifies the maximum number of elements to retrieve, same as the Limit in SQL queries. default value is 10. maximum value is 200.
         * @type {number || null}
         */
        this.Limit = null;

        /**
         * Filter by creator role. default 0 means data keys created by the user, 1 means data keys automatically created by authorized cloud services.
         * @type {number || null}
         */
        this.Role = null;

        /**
         * Sorts according to the creation time of DataKey. 0 indicates descending sort. 1 indicates ascending sort.
         * @type {number || null}
         */
        this.OrderType = null;

        /**
         * Filter based on DataKey state. 0 means all datakeys, 1 means querying only Enabled datakeys, 2 means querying only Disabled datakeys, 3 means querying datakeys in PendingDelete state (keys in scheduled deletion status).
         * @type {number || null}
         */
        this.KeyState = null;

        /**
         * Performs a fuzzy match query based on DataKeyId or DataKeyName.
         * @type {string || null}
         */
        this.SearchKeyAlias = null;

        /**
         * Filters data keys by DateKey type. "TENCENT_KMS" filters data keys with key material created by KMS. "EXTERNAL" filters EXTERNAL type data keys requiring user-imported key material. "ALL" or leave unset queries both types. case-sensitive.
         * @type {string || null}
         */
        this.Origin = null;

        /**
         * HSM cluster ID corresponding to KMS advanced edition.
         * @type {string || null}
         */
        this.HsmClusterId = null;

        /**
         * Specifies the globally unique identifier of the root key.
         * @type {string || null}
         */
        this.KeyId = null;

        /**
         * Length of the data key.
         * @type {number || null}
         */
        this.DataKeyLen = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.Offset = 'Offset' in params ? params.Offset : null;
        this.Limit = 'Limit' in params ? params.Limit : null;
        this.Role = 'Role' in params ? params.Role : null;
        this.OrderType = 'OrderType' in params ? params.OrderType : null;
        this.KeyState = 'KeyState' in params ? params.KeyState : null;
        this.SearchKeyAlias = 'SearchKeyAlias' in params ? params.SearchKeyAlias : null;
        this.Origin = 'Origin' in params ? params.Origin : null;
        this.HsmClusterId = 'HsmClusterId' in params ? params.HsmClusterId : null;
        this.KeyId = 'KeyId' in params ? params.KeyId : null;
        this.DataKeyLen = 'DataKeyLen' in params ? params.DataKeyLen : null;

    }
}

/**
 * CancelDataKeyDeletion response structure.
 * @class
 */
class CancelDataKeyDeletionResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique identifier of the data key scheduled for deletion.
         * @type {string || null}
         */
        this.DataKeyId = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.DataKeyId = 'DataKeyId' in params ? params.DataKeyId : null;
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * ListKeys request structure.
 * @class
 */
class ListKeysRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * This parameter has the same meaning of the `Offset` in an SQL query, indicating that this acquisition starts from the "No. Offset value" element of the array arranged in a certain order. The default value is 0
         * @type {number || null}
         */
        this.Offset = null;

        /**
         * This parameter has the same meaning of the `Limit` in an SQL query, indicating that up to `Limit` value elements can be obtained in this request. The default value is 10 and the maximum value is 200
         * @type {number || null}
         */
        this.Limit = null;

        /**
         * Filter by creator role. 0 (default value): the CMK is created by the user; 1: the CMK is created automatically by an authorized Tencent Cloud service
         * @type {number || null}
         */
        this.Role = null;

        /**
         * ID of the HSM cluster. This field is only valid for Exclusive and Managed KMS instances.
         * @type {string || null}
         */
        this.HsmClusterId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.Offset = 'Offset' in params ? params.Offset : null;
        this.Limit = 'Limit' in params ? params.Limit : null;
        this.Role = 'Role' in params ? params.Role : null;
        this.HsmClusterId = 'HsmClusterId' in params ? params.HsmClusterId : null;

    }
}

/**
 * DescribeWhiteBoxDecryptKey request structure.
 * @class
 */
class DescribeWhiteBoxDecryptKeyRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Globally unique white-box key ID
         * @type {string || null}
         */
        this.KeyId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.KeyId = 'KeyId' in params ? params.KeyId : null;

    }
}

/**
 * Specifies the data key attribute.
 * @class
 */
class DataKey extends  AbstractModel {
    constructor(){
        super();

        /**
         * Globally unique id of DataKey.
         * @type {string || null}
         */
        this.DataKeyId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.DataKeyId = 'DataKeyId' in params ? params.DataKeyId : null;

    }
}

/**
 * CMK attribute information
 * @class
 */
class KeyMetadata extends  AbstractModel {
    constructor(){
        super();

        /**
         * Globally unique CMK ID
         * @type {string || null}
         */
        this.KeyId = null;

        /**
         * Alias that makes a key more recognizable and understandable
         * @type {string || null}
         */
        this.Alias = null;

        /**
         * Key creation time
         * @type {number || null}
         */
        this.CreateTime = null;

        /**
         * CMK description
         * @type {string || null}
         */
        this.Description = null;

        /**
         * CMK status. Valid values: Enabled, Disabled, PendingDelete, PendingImport, Archived.
         * @type {string || null}
         */
        this.KeyState = null;

        /**
         * CMK purpose. Valid values: `ENCRYPT_DECRYPT`, `ASYMMETRIC_DECRYPT_RSA_2048`, `ASYMMETRIC_DECRYPT_SM2`, `ASYMMETRIC_SIGN_VERIFY_SM2`, `ASYMMETRIC_SIGN_VERIFY_RSA_2048`, and `ASYMMETRIC_SIGN_VERIFY_ECC`.
         * @type {string || null}
         */
        this.KeyUsage = null;

        /**
         * CMK type. 2: FIPS-compliant; 4: SM-CRYPTO
         * @type {number || null}
         */
        this.Type = null;

        /**
         * Creator
         * @type {number || null}
         */
        this.CreatorUin = null;

        /**
         * Whether key rotation is enabled
         * @type {boolean || null}
         */
        this.KeyRotationEnabled = null;

        /**
         * CMK creator. The value of this parameter is `user` if the CMK is created by the user, or the corresponding service name if it is created automatically by an authorized Tencent Cloud service.
         * @type {string || null}
         */
        this.Owner = null;

        /**
         * Time of next rotation if key rotation is enabled
         * @type {number || null}
         */
        this.NextRotateTime = null;

        /**
         * The time when scheduled deletion occurs.
         * @type {number || null}
         */
        this.DeletionDate = null;

        /**
         * CMK key material type. the type created by KMS is TENCENT_KMS. the user-imported type is EXTERNAL.
         * @type {string || null}
         */
        this.Origin = null;

        /**
         * Valid when Origin is EXTERNAL. indicates the validity date of the key material. 0 means no expiration.
         * @type {number || null}
         */
        this.ValidTo = null;

        /**
         * Resource ID in the format of `creatorUin/$creatorUin/$keyId`.
         * @type {string || null}
         */
        this.ResourceId = null;

        /**
         * HSM cluster ID (valid only for exclusive or managed version KMS service instances).
         * @type {string || null}
         */
        this.HsmClusterId = null;

        /**
         * Key rotation period (days).
         * @type {number || null}
         */
        this.RotateDays = null;

        /**
         * Last disorderly rotation time (Unix timestamp).
         * @type {number || null}
         */
        this.LastRotateTime = null;

        /**
         * Specifies whether the key is a primary replica. valid values: 0 (primary replica), 1 (synced replica).
         * @type {number || null}
         */
        this.IsSyncReplica = null;

        /**
         * Synchronous original region.
         * @type {string || null}
         */
        this.SourceRegion = null;

        /**
         * The state of key synchronization. valid values: 0 (unsynced), 1 (synchronization successful), 2 (synchronization failed), 3 (synchronizing).
         * @type {number || null}
         */
        this.SyncStatus = null;

        /**
         * Describes the synchronous result.
         * @type {string || null}
         */
        this.SyncMessages = null;

        /**
         * Start time of synchronization.
         * @type {number || null}
         */
        this.SyncStartTime = null;

        /**
         * Specifies the synchronous end time.
         * @type {number || null}
         */
        this.SyncEndTime = null;

        /**
         * Synchronous original cluster. if empty, it is a public cloud public cluster.
         * @type {string || null}
         */
        this.SourceHsmClusterId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.KeyId = 'KeyId' in params ? params.KeyId : null;
        this.Alias = 'Alias' in params ? params.Alias : null;
        this.CreateTime = 'CreateTime' in params ? params.CreateTime : null;
        this.Description = 'Description' in params ? params.Description : null;
        this.KeyState = 'KeyState' in params ? params.KeyState : null;
        this.KeyUsage = 'KeyUsage' in params ? params.KeyUsage : null;
        this.Type = 'Type' in params ? params.Type : null;
        this.CreatorUin = 'CreatorUin' in params ? params.CreatorUin : null;
        this.KeyRotationEnabled = 'KeyRotationEnabled' in params ? params.KeyRotationEnabled : null;
        this.Owner = 'Owner' in params ? params.Owner : null;
        this.NextRotateTime = 'NextRotateTime' in params ? params.NextRotateTime : null;
        this.DeletionDate = 'DeletionDate' in params ? params.DeletionDate : null;
        this.Origin = 'Origin' in params ? params.Origin : null;
        this.ValidTo = 'ValidTo' in params ? params.ValidTo : null;
        this.ResourceId = 'ResourceId' in params ? params.ResourceId : null;
        this.HsmClusterId = 'HsmClusterId' in params ? params.HsmClusterId : null;
        this.RotateDays = 'RotateDays' in params ? params.RotateDays : null;
        this.LastRotateTime = 'LastRotateTime' in params ? params.LastRotateTime : null;
        this.IsSyncReplica = 'IsSyncReplica' in params ? params.IsSyncReplica : null;
        this.SourceRegion = 'SourceRegion' in params ? params.SourceRegion : null;
        this.SyncStatus = 'SyncStatus' in params ? params.SyncStatus : null;
        this.SyncMessages = 'SyncMessages' in params ? params.SyncMessages : null;
        this.SyncStartTime = 'SyncStartTime' in params ? params.SyncStartTime : null;
        this.SyncEndTime = 'SyncEndTime' in params ? params.SyncEndTime : null;
        this.SourceHsmClusterId = 'SourceHsmClusterId' in params ? params.SourceHsmClusterId : null;

    }
}

/**
 * CancelKeyArchive response structure.
 * @class
 */
class CancelKeyArchiveResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * GetPublicKey response structure.
 * @class
 */
class GetPublicKeyResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * Unique CMK ID.
         * @type {string || null}
         */
        this.KeyId = null;

        /**
         * Base64-encoded public key content.
         * @type {string || null}
         */
        this.PublicKey = null;

        /**
         * Public key content in PEM format.
         * @type {string || null}
         */
        this.PublicKeyPem = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.KeyId = 'KeyId' in params ? params.KeyId : null;
        this.PublicKey = 'PublicKey' in params ? params.PublicKey : null;
        this.PublicKeyPem = 'PublicKeyPem' in params ? params.PublicKeyPem : null;
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * Decrypt request structure.
 * @class
 */
class DecryptRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * The ciphertext data to be decrypted.
         * @type {string || null}
         */
        this.CiphertextBlob = null;

        /**
         * JSON string of key-value pair. If this parameter is specified for `Encrypt`, the same parameter needs to be provided when the `Decrypt` API is called. The maximum length is 1,024 bytes.
         * @type {string || null}
         */
        this.EncryptionContext = null;

        /**
         * PEM-encoded public key (2048-bit RSA/SM2 key), which can be used to encrypt the `Plaintext` returned. If this field is left empty, the `Plaintext` will not be encrypted.
         * @type {string || null}
         */
        this.EncryptionPublicKey = null;

        /**
         * Asymmetric encryption algorithm. Valid values: `SM2` (C1C3C2 ciphertext is returned), `SM2_C1C3C2_ASN1` (C1C3C2 ASN1 ciphertext is returned), `RSAES_PKCS1_V1_5`, `RSAES_OAEP_SHA_1`, and `RSAES_OAEP_SHA_256`. This field is used in combination with `EncryptionPublicKey` for encryption. If it is left empty, an SM2 public key will be used by default.
         * @type {string || null}
         */
        this.EncryptionAlgorithm = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.CiphertextBlob = 'CiphertextBlob' in params ? params.CiphertextBlob : null;
        this.EncryptionContext = 'EncryptionContext' in params ? params.EncryptionContext : null;
        this.EncryptionPublicKey = 'EncryptionPublicKey' in params ? params.EncryptionPublicKey : null;
        this.EncryptionAlgorithm = 'EncryptionAlgorithm' in params ? params.EncryptionAlgorithm : null;

    }
}

/**
 * DescribeWhiteBoxKeyDetails request structure.
 * @class
 */
class DescribeWhiteBoxKeyDetailsRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Filter: key status. 0: disabled, 1: enabled
         * @type {number || null}
         */
        this.KeyStatus = null;

        /**
         * This parameter has the same meaning of the `Offset` in an SQL query, indicating that this acquisition starts from the "No. Offset value" element of the array arranged in a certain order. The default value is 0.
         * @type {number || null}
         */
        this.Offset = null;

        /**
         * This parameter has the same meaning of the `Limit` in an SQL query, indicating that up to `Limit` value elements can be obtained in this request. The default value is 0, indicating not to paginate.
         * @type {number || null}
         */
        this.Limit = null;

        /**
         * Tag filter condition
         * @type {Array.<TagFilter> || null}
         */
        this.TagFilters = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.KeyStatus = 'KeyStatus' in params ? params.KeyStatus : null;
        this.Offset = 'Offset' in params ? params.Offset : null;
        this.Limit = 'Limit' in params ? params.Limit : null;

        if (params.TagFilters) {
            this.TagFilters = new Array();
            for (let z in params.TagFilters) {
                let obj = new TagFilter();
                obj.deserialize(params.TagFilters[z]);
                this.TagFilters.push(obj);
            }
        }

    }
}

/**
 * PostQuantumCryptoSign request structure.
 * @class
 */
class PostQuantumCryptoSignRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Original message text before Base64 encoding. It cannot exceed 4096 bytes. 
         * @type {string || null}
         */
        this.Message = null;

        /**
         * Unique ID of a key
         * @type {string || null}
         */
        this.KeyId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.Message = 'Message' in params ? params.Message : null;
        this.KeyId = 'KeyId' in params ? params.KeyId : null;

    }
}

/**
 * PostQuantumCryptoDecrypt request structure.
 * @class
 */
class PostQuantumCryptoDecryptRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * The ciphertext data to be decrypted.
         * @type {string || null}
         */
        this.CiphertextBlob = null;

        /**
         * PEM-encoded public key (2048-bit RSA/SM2 key), which can be used to encrypt the `Plaintext` returned. If this field is left empty, the `Plaintext` will not be encrypted.
         * @type {string || null}
         */
        this.EncryptionPublicKey = null;

        /**
         * Asymmetric encryption algorithm. It is used in combination with `EncryptionPublicKey` to encrypt the returned data. Values: `SM2`(Return the ciphertext in the format of "C1C3C2"), `SM2_C1C3C2_ASN1` (Return the ciphertext in the format of "C1C3C2 ASN1"), `RSAES_PKCS1_V1_5`, `RSAES_OAEP_SHA_1`, `RSAES_OAEP_SHA_256`. It defaults to `SM2` if it's not specified. 
         * @type {string || null}
         */
        this.EncryptionAlgorithm = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.CiphertextBlob = 'CiphertextBlob' in params ? params.CiphertextBlob : null;
        this.EncryptionPublicKey = 'EncryptionPublicKey' in params ? params.EncryptionPublicKey : null;
        this.EncryptionAlgorithm = 'EncryptionAlgorithm' in params ? params.EncryptionAlgorithm : null;

    }
}

/**
 * Target region list of the sync task, including region and cluster information. if the cluster is empty, it means public cloud shared cluster. if the cluster is not empty, it means dedicated cluster.
 * @class
 */
class DestinationSyncConfig extends  AbstractModel {
    constructor(){
        super();

        /**
         * Specifies the target region of the synchronization task.
         * @type {string || null}
         */
        this.DestinationRegion = null;

        /**
         * HsmClusterId being empty indicates public cloud shared version. if not empty, it indicates exclusive edition cluster in the region.
         * @type {string || null}
         */
        this.HsmClusterId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.DestinationRegion = 'DestinationRegion' in params ? params.DestinationRegion : null;
        this.HsmClusterId = 'HsmClusterId' in params ? params.HsmClusterId : null;

    }
}

/**
 * CancelKeyDeletion response structure.
 * @class
 */
class CancelKeyDeletionResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * Unique ID of the CMK for which the schedule deletion is canceled
         * @type {string || null}
         */
        this.KeyId = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.KeyId = 'KeyId' in params ? params.KeyId : null;
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * DisableKeys request structure.
 * @class
 */
class DisableKeysRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * List of IDs of the CMKs to be disabled in batches. Up to 100 CMKs are supported at a time
         * @type {Array.<string> || null}
         */
        this.KeyIds = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.KeyIds = 'KeyIds' in params ? params.KeyIds : null;

    }
}

/**
 * DisableWhiteBoxKey request structure.
 * @class
 */
class DisableWhiteBoxKeyRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Globally unique white-box key ID
         * @type {string || null}
         */
        this.KeyId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.KeyId = 'KeyId' in params ? params.KeyId : null;

    }
}

/**
 * UnbindCloudResource request structure.
 * @class
 */
class UnbindCloudResourceRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * CMK ID
         * @type {string || null}
         */
        this.KeyId = null;

        /**
         * Unique ID of a Tencent Cloud service
         * @type {string || null}
         */
        this.ProductId = null;

        /**
         * Resource/instance ID, which is stored as a string and defined by the caller based on the Tencent Cloud service's features.
         * @type {string || null}
         */
        this.ResourceId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.KeyId = 'KeyId' in params ? params.KeyId : null;
        this.ProductId = 'ProductId' in params ? params.ProductId : null;
        this.ResourceId = 'ResourceId' in params ? params.ResourceId : null;

    }
}

/**
 * OverwriteWhiteBoxDeviceFingerprints request structure.
 * @class
 */
class OverwriteWhiteBoxDeviceFingerprintsRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * White-box key ID
         * @type {string || null}
         */
        this.KeyId = null;

        /**
         * Device fingerprint list. If the list is empty, it means to delete all fingerprint information corresponding to the key. There can be up to 200 entries in the list.
         * @type {Array.<DeviceFingerprint> || null}
         */
        this.DeviceFingerprints = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.KeyId = 'KeyId' in params ? params.KeyId : null;

        if (params.DeviceFingerprints) {
            this.DeviceFingerprints = new Array();
            for (let z in params.DeviceFingerprints) {
                let obj = new DeviceFingerprint();
                obj.deserialize(params.DeviceFingerprints[z]);
                this.DeviceFingerprints.push(obj);
            }
        }

    }
}

/**
 * EnableKeyRotation response structure.
 * @class
 */
class EnableKeyRotationResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * BindCloudResource response structure.
 * @class
 */
class BindCloudResourceResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * EnableKeys response structure.
 * @class
 */
class EnableKeysResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * SignByAsymmetricKey request structure.
 * @class
 */
class SignByAsymmetricKeyRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Signature algorithm. The valid values include `SM2DSA`, `ECC_P256_R1`, `RSA_PSS_SHA_256`, and `RSA_PKCS1_SHA_256`, etc. You can get a full list of supported algorithms using the ListAlgorithms API.
         * @type {string || null}
         */
        this.Algorithm = null;

        /**
         * Full message or message abstract. Before Base64 encoding, an original message can contain up to 4,096 bytes while a message abstract must be 32 bytes.
         * @type {string || null}
         */
        this.Message = null;

        /**
         * Unique ID of a key
         * @type {string || null}
         */
        this.KeyId = null;

        /**
         * Message type. Valid values: `RAW` (indicating an original message; used by default if the parameter is not passed in) and `DIGEST`.
         * @type {string || null}
         */
        this.MessageType = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.Algorithm = 'Algorithm' in params ? params.Algorithm : null;
        this.Message = 'Message' in params ? params.Message : null;
        this.KeyId = 'KeyId' in params ? params.KeyId : null;
        this.MessageType = 'MessageType' in params ? params.MessageType : null;

    }
}

/**
 * DescribeWhiteBoxDeviceFingerprints request structure.
 * @class
 */
class DescribeWhiteBoxDeviceFingerprintsRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * White-box key ID
         * @type {string || null}
         */
        this.KeyId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.KeyId = 'KeyId' in params ? params.KeyId : null;

    }
}

/**
 * GetRegions request structure.
 * @class
 */
class GetRegionsRequest extends  AbstractModel {
    constructor(){
        super();

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }

    }
}

/**
 * PostQuantumCryptoEncrypt response structure.
 * @class
 */
class PostQuantumCryptoEncryptResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * Base64-encoded ciphertext after encryption. This field contains the information of ciphertext and keys. It is not the result of encrypting the plaintext. To get the plaintext, you need to pass in this field to the PostQuantumCryptoDecrypt API.
         * @type {string || null}
         */
        this.CiphertextBlob = null;

        /**
         * Globally unique ID of the CMK used for encryption
         * @type {string || null}
         */
        this.KeyId = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.CiphertextBlob = 'CiphertextBlob' in params ? params.CiphertextBlob : null;
        this.KeyId = 'KeyId' in params ? params.KeyId : null;
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * EncryptByWhiteBox request structure.
 * @class
 */
class EncryptByWhiteBoxRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Globally unique white-box key ID
         * @type {string || null}
         */
        this.KeyId = null;

        /**
         * Base64-encoded text to be encrypted. The size of the original text cannot exceed 4 KB.
         * @type {string || null}
         */
        this.PlainText = null;

        /**
         * Base64-encoded initialization vector of 16 bytes, which will be used by the encryption algorithm. If this parameter is not passed in, the backend service will generate a random one. You should save this value as a parameter for decryption.
         * @type {string || null}
         */
        this.InitializationVector = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.KeyId = 'KeyId' in params ? params.KeyId : null;
        this.PlainText = 'PlainText' in params ? params.PlainText : null;
        this.InitializationVector = 'InitializationVector' in params ? params.InitializationVector : null;

    }
}

/**
 * GenerateRandom request structure.
 * @class
 */
class GenerateRandomRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Length of the random number. Minimum value: 1. Maximum value: 1024
         * @type {number || null}
         */
        this.NumberOfBytes = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.NumberOfBytes = 'NumberOfBytes' in params ? params.NumberOfBytes : null;

    }
}

/**
 * Returned CMK list information
 * @class
 */
class Key extends  AbstractModel {
    constructor(){
        super();

        /**
         * Globally unique CMK ID.
         * @type {string || null}
         */
        this.KeyId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.KeyId = 'KeyId' in params ? params.KeyId : null;

    }
}

/**
 * DisableDataKeys response structure.
 * @class
 */
class DisableDataKeysResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * ScheduleKeyDeletion request structure.
 * @class
 */
class ScheduleKeyDeletionRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Unique CMK ID
         * @type {string || null}
         */
        this.KeyId = null;

        /**
         * Schedule deletion time range. Value range: [7,30]
         * @type {number || null}
         */
        this.PendingWindowInDays = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.KeyId = 'KeyId' in params ? params.KeyId : null;
        this.PendingWindowInDays = 'PendingWindowInDays' in params ? params.PendingWindowInDays : null;

    }
}

/**
 * CancelDataKeyDeletion request structure.
 * @class
 */
class CancelDataKeyDeletionRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Unique id of a data key.
         * @type {string || null}
         */
        this.DataKeyId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.DataKeyId = 'DataKeyId' in params ? params.DataKeyId : null;

    }
}

/**
 * PostQuantumCryptoEncrypt request structure.
 * @class
 */
class PostQuantumCryptoEncryptRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Globally unique ID of the CMK generated by calling the `CreateKey` API
         * @type {string || null}
         */
        this.KeyId = null;

        /**
         * Encrypted plaintext data. This field must be Base64-encoded. The maximum size of the original data is 4 KB.
         * @type {string || null}
         */
        this.PlainText = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.KeyId = 'KeyId' in params ? params.KeyId : null;
        this.PlainText = 'PlainText' in params ? params.PlainText : null;

    }
}

/**
 * DisableKey request structure.
 * @class
 */
class DisableKeyRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Unique CMK ID
         * @type {string || null}
         */
        this.KeyId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.KeyId = 'KeyId' in params ? params.KeyId : null;

    }
}

/**
 * ImportKeyMaterial response structure.
 * @class
 */
class ImportKeyMaterialResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * EnableDataKey request structure.
 * @class
 */
class EnableDataKeyRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Unique id of a data key.
         * @type {string || null}
         */
        this.DataKeyId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.DataKeyId = 'DataKeyId' in params ? params.DataKeyId : null;

    }
}

/**
 * BindCloudResource request structure.
 * @class
 */
class BindCloudResourceRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * CMK ID
         * @type {string || null}
         */
        this.KeyId = null;

        /**
         * Unique ID of a Tencent Cloud service
         * @type {string || null}
         */
        this.ProductId = null;

        /**
         * Resource/instance ID, which is stored as a string and defined by the caller based on the Tencent Cloud service's features.
         * @type {string || null}
         */
        this.ResourceId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.KeyId = 'KeyId' in params ? params.KeyId : null;
        this.ProductId = 'ProductId' in params ? params.ProductId : null;
        this.ResourceId = 'ResourceId' in params ? params.ResourceId : null;

    }
}

/**
 * GetDataKeyCiphertextBlob response structure.
 * @class
 */
class GetDataKeyCiphertextBlobResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * Specifies the ciphertext of the data key.
         * @type {string || null}
         */
        this.CiphertextBlob = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.CiphertextBlob = 'CiphertextBlob' in params ? params.CiphertextBlob : null;
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * PostQuantumCryptoSign response structure.
 * @class
 */
class PostQuantumCryptoSignResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * Base64-encoded signature You can use PostQuantumCryptoVerify to verify the signature value.
         * @type {string || null}
         */
        this.Signature = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.Signature = 'Signature' in params ? params.Signature : null;
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * SignByAsymmetricKey response structure.
 * @class
 */
class SignByAsymmetricKeyResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * Base64-encoded signature
         * @type {string || null}
         */
        this.Signature = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.Signature = 'Signature' in params ? params.Signature : null;
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * PostQuantumCryptoVerify response structure.
 * @class
 */
class PostQuantumCryptoVerifyResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * Verify whether the signature is valid. `true`: The signature is valid. `false`: The signature is invalid.
         * @type {boolean || null}
         */
        this.SignatureValid = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.SignatureValid = 'SignatureValid' in params ? params.SignatureValid : null;
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * DescribeWhiteBoxDecryptKey response structure.
 * @class
 */
class DescribeWhiteBoxDecryptKeyResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * Base64-encoded white-box decryption key
         * @type {string || null}
         */
        this.DecryptKey = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.DecryptKey = 'DecryptKey' in params ? params.DecryptKey : null;
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * DescribeWhiteBoxDeviceFingerprints response structure.
 * @class
 */
class DescribeWhiteBoxDeviceFingerprintsResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * Device fingerprint list
         * @type {Array.<DeviceFingerprint> || null}
         */
        this.DeviceFingerprints = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }

        if (params.DeviceFingerprints) {
            this.DeviceFingerprints = new Array();
            for (let z in params.DeviceFingerprints) {
                let obj = new DeviceFingerprint();
                obj.deserialize(params.DeviceFingerprints[z]);
                this.DeviceFingerprints.push(obj);
            }
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * PostQuantumCryptoDecrypt response structure.
 * @class
 */
class PostQuantumCryptoDecryptResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * Globally unique CMK ID
         * @type {string || null}
         */
        this.KeyId = null;

        /**
         * If `EncryptionPublicKey` is left empty, a Base64-encoded ciphertext will be returned. To get the plaintext, you need to decode the ciphertext first.
If `EncryptionPublicKey` is passed in, this field contains the Base64-encoded ciphertext after asymmetric encryption by using the public key in `EncryptionPublicKey` To get the plaintext, you need to first decode the Base64 format, and then decrypwith the private key corresponding with the public key. The private key is uploaded by the user. 
         * @type {string || null}
         */
        this.PlainText = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.KeyId = 'KeyId' in params ? params.KeyId : null;
        this.PlainText = 'PlainText' in params ? params.PlainText : null;
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * DisableDataKeys request structure.
 * @class
 */
class DisableDataKeysRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Specifies the Id list of datakeys to be bulk disabled. supports a maximum of 100 data keys.
         * @type {Array.<string> || null}
         */
        this.DataKeyIds = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.DataKeyIds = 'DataKeyIds' in params ? params.DataKeyIds : null;

    }
}

/**
 * UpdateKeyDescription request structure.
 * @class
 */
class UpdateKeyDescriptionRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * New description of up to 1,024 bytes in length
         * @type {string || null}
         */
        this.Description = null;

        /**
         * ID of the CMK for which to modify the description
         * @type {string || null}
         */
        this.KeyId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.Description = 'Description' in params ? params.Description : null;
        this.KeyId = 'KeyId' in params ? params.KeyId : null;

    }
}

/**
 * UnbindCloudResource response structure.
 * @class
 */
class UnbindCloudResourceResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * DescribeKey response structure.
 * @class
 */
class DescribeKeyResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * Specifies the attribute information of the key.
         * @type {KeyMetadata || null}
         */
        this.KeyMetadata = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }

        if (params.KeyMetadata) {
            let obj = new KeyMetadata();
            obj.deserialize(params.KeyMetadata)
            this.KeyMetadata = obj;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * CancelKeyArchive request structure.
 * @class
 */
class CancelKeyArchiveRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Unique CMK ID
         * @type {string || null}
         */
        this.KeyId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.KeyId = 'KeyId' in params ? params.KeyId : null;

    }
}

/**
 * DisableKeyRotation request structure.
 * @class
 */
class DisableKeyRotationRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Unique CMK ID
         * @type {string || null}
         */
        this.KeyId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.KeyId = 'KeyId' in params ? params.KeyId : null;

    }
}

module.exports = {
    UpdateAliasRequest: UpdateAliasRequest,
    EnableWhiteBoxKeyRequest: EnableWhiteBoxKeyRequest,
    AsymmetricRsaDecryptRequest: AsymmetricRsaDecryptRequest,
    EnableKeyRotationRequest: EnableKeyRotationRequest,
    DescribeWhiteBoxKeyDetailsResponse: DescribeWhiteBoxKeyDetailsResponse,
    CreateKeyRequest: CreateKeyRequest,
    DisableWhiteBoxKeyResponse: DisableWhiteBoxKeyResponse,
    DisableKeyResponse: DisableKeyResponse,
    DescribeWhiteBoxServiceStatusRequest: DescribeWhiteBoxServiceStatusRequest,
    UpdateDataKeyDescriptionRequest: UpdateDataKeyDescriptionRequest,
    DescribeDataKeyResponse: DescribeDataKeyResponse,
    DisableDataKeyResponse: DisableDataKeyResponse,
    DescribeKeyRequest: DescribeKeyRequest,
    WhiteboxKeyInfo: WhiteboxKeyInfo,
    DescribeDataKeysRequest: DescribeDataKeysRequest,
    ListAlgorithmsResponse: ListAlgorithmsResponse,
    DisableKeysResponse: DisableKeysResponse,
    EnableDataKeyResponse: EnableDataKeyResponse,
    DescribeWhiteBoxKeyResponse: DescribeWhiteBoxKeyResponse,
    UpdateKeyDescriptionResponse: UpdateKeyDescriptionResponse,
    DescribeWhiteBoxServiceStatusResponse: DescribeWhiteBoxServiceStatusResponse,
    AsymmetricRsaDecryptResponse: AsymmetricRsaDecryptResponse,
    ScheduleDataKeyDeletionResponse: ScheduleDataKeyDeletionResponse,
    EnableKeyRequest: EnableKeyRequest,
    GetKeyRotationStatusRequest: GetKeyRotationStatusRequest,
    ListAlgorithmsRequest: ListAlgorithmsRequest,
    Tag: Tag,
    ListKeyDetailResponse: ListKeyDetailResponse,
    GenerateDataKeyRequest: GenerateDataKeyRequest,
    UpdateAliasResponse: UpdateAliasResponse,
    ScheduleKeyDeletionResponse: ScheduleKeyDeletionResponse,
    PostQuantumCryptoVerifyRequest: PostQuantumCryptoVerifyRequest,
    GenerateRandomResponse: GenerateRandomResponse,
    UpdateDataKeyNameRequest: UpdateDataKeyNameRequest,
    ScheduleDataKeyDeletionRequest: ScheduleDataKeyDeletionRequest,
    DescribeKeysRequest: DescribeKeysRequest,
    GetPublicKeyRequest: GetPublicKeyRequest,
    GetServiceStatusRequest: GetServiceStatusRequest,
    EnableWhiteBoxKeysResponse: EnableWhiteBoxKeysResponse,
    ArchiveKeyResponse: ArchiveKeyResponse,
    VerifyByAsymmetricKeyResponse: VerifyByAsymmetricKeyResponse,
    DescribeDataKeysResponse: DescribeDataKeysResponse,
    DescribeWhiteBoxKeyRequest: DescribeWhiteBoxKeyRequest,
    GetParametersForImportResponse: GetParametersForImportResponse,
    DecryptResponse: DecryptResponse,
    ListDataKeyDetailResponse: ListDataKeyDetailResponse,
    CreateWhiteBoxKeyResponse: CreateWhiteBoxKeyResponse,
    ImportKeyMaterialRequest: ImportKeyMaterialRequest,
    DeleteImportedKeyMaterialResponse: DeleteImportedKeyMaterialResponse,
    EnableKeysRequest: EnableKeysRequest,
    EnableWhiteBoxKeysRequest: EnableWhiteBoxKeysRequest,
    EncryptByWhiteBoxResponse: EncryptByWhiteBoxResponse,
    UpdateDataKeyNameResponse: UpdateDataKeyNameResponse,
    DescribeKeysResponse: DescribeKeysResponse,
    EnableWhiteBoxKeyResponse: EnableWhiteBoxKeyResponse,
    ListDataKeysResponse: ListDataKeysResponse,
    ReEncryptRequest: ReEncryptRequest,
    ListKeysResponse: ListKeysResponse,
    TagFilter: TagFilter,
    DescribeDataKeyRequest: DescribeDataKeyRequest,
    AsymmetricSm2DecryptResponse: AsymmetricSm2DecryptResponse,
    DisableKeyRotationResponse: DisableKeyRotationResponse,
    DataKeyMetadata: DataKeyMetadata,
    VerifyByAsymmetricKeyRequest: VerifyByAsymmetricKeyRequest,
    DisableWhiteBoxKeysRequest: DisableWhiteBoxKeysRequest,
    ImportDataKeyRequest: ImportDataKeyRequest,
    ListKeyDetailRequest: ListKeyDetailRequest,
    DeleteWhiteBoxKeyRequest: DeleteWhiteBoxKeyRequest,
    AlgorithmInfo: AlgorithmInfo,
    GetRegionsResponse: GetRegionsResponse,
    UpdateDataKeyDescriptionResponse: UpdateDataKeyDescriptionResponse,
    ExclusiveHSM: ExclusiveHSM,
    CancelKeyDeletionRequest: CancelKeyDeletionRequest,
    EnableDataKeysResponse: EnableDataKeysResponse,
    GenerateDataKeyResponse: GenerateDataKeyResponse,
    EnableDataKeysRequest: EnableDataKeysRequest,
    CreateWhiteBoxKeyRequest: CreateWhiteBoxKeyRequest,
    GetDataKeyPlaintextResponse: GetDataKeyPlaintextResponse,
    DisableDataKeyRequest: DisableDataKeyRequest,
    OverwriteWhiteBoxDeviceFingerprintsResponse: OverwriteWhiteBoxDeviceFingerprintsResponse,
    DisableWhiteBoxKeysResponse: DisableWhiteBoxKeysResponse,
    ArchiveKeyRequest: ArchiveKeyRequest,
    GetParametersForImportRequest: GetParametersForImportRequest,
    CreateKeyResponse: CreateKeyResponse,
    ReEncryptResponse: ReEncryptResponse,
    EncryptResponse: EncryptResponse,
    GetDataKeyPlaintextRequest: GetDataKeyPlaintextRequest,
    GetDataKeyCiphertextBlobRequest: GetDataKeyCiphertextBlobRequest,
    DeleteImportedKeyMaterialRequest: DeleteImportedKeyMaterialRequest,
    EnableKeyResponse: EnableKeyResponse,
    ImportDataKeyResponse: ImportDataKeyResponse,
    GetServiceStatusResponse: GetServiceStatusResponse,
    DeviceFingerprint: DeviceFingerprint,
    GetKeyRotationStatusResponse: GetKeyRotationStatusResponse,
    EncryptRequest: EncryptRequest,
    AsymmetricSm2DecryptRequest: AsymmetricSm2DecryptRequest,
    ListDataKeysRequest: ListDataKeysRequest,
    DeleteWhiteBoxKeyResponse: DeleteWhiteBoxKeyResponse,
    ListDataKeyDetailRequest: ListDataKeyDetailRequest,
    CancelDataKeyDeletionResponse: CancelDataKeyDeletionResponse,
    ListKeysRequest: ListKeysRequest,
    DescribeWhiteBoxDecryptKeyRequest: DescribeWhiteBoxDecryptKeyRequest,
    DataKey: DataKey,
    KeyMetadata: KeyMetadata,
    CancelKeyArchiveResponse: CancelKeyArchiveResponse,
    GetPublicKeyResponse: GetPublicKeyResponse,
    DecryptRequest: DecryptRequest,
    DescribeWhiteBoxKeyDetailsRequest: DescribeWhiteBoxKeyDetailsRequest,
    PostQuantumCryptoSignRequest: PostQuantumCryptoSignRequest,
    PostQuantumCryptoDecryptRequest: PostQuantumCryptoDecryptRequest,
    DestinationSyncConfig: DestinationSyncConfig,
    CancelKeyDeletionResponse: CancelKeyDeletionResponse,
    DisableKeysRequest: DisableKeysRequest,
    DisableWhiteBoxKeyRequest: DisableWhiteBoxKeyRequest,
    UnbindCloudResourceRequest: UnbindCloudResourceRequest,
    OverwriteWhiteBoxDeviceFingerprintsRequest: OverwriteWhiteBoxDeviceFingerprintsRequest,
    EnableKeyRotationResponse: EnableKeyRotationResponse,
    BindCloudResourceResponse: BindCloudResourceResponse,
    EnableKeysResponse: EnableKeysResponse,
    SignByAsymmetricKeyRequest: SignByAsymmetricKeyRequest,
    DescribeWhiteBoxDeviceFingerprintsRequest: DescribeWhiteBoxDeviceFingerprintsRequest,
    GetRegionsRequest: GetRegionsRequest,
    PostQuantumCryptoEncryptResponse: PostQuantumCryptoEncryptResponse,
    EncryptByWhiteBoxRequest: EncryptByWhiteBoxRequest,
    GenerateRandomRequest: GenerateRandomRequest,
    Key: Key,
    DisableDataKeysResponse: DisableDataKeysResponse,
    ScheduleKeyDeletionRequest: ScheduleKeyDeletionRequest,
    CancelDataKeyDeletionRequest: CancelDataKeyDeletionRequest,
    PostQuantumCryptoEncryptRequest: PostQuantumCryptoEncryptRequest,
    DisableKeyRequest: DisableKeyRequest,
    ImportKeyMaterialResponse: ImportKeyMaterialResponse,
    EnableDataKeyRequest: EnableDataKeyRequest,
    BindCloudResourceRequest: BindCloudResourceRequest,
    GetDataKeyCiphertextBlobResponse: GetDataKeyCiphertextBlobResponse,
    PostQuantumCryptoSignResponse: PostQuantumCryptoSignResponse,
    SignByAsymmetricKeyResponse: SignByAsymmetricKeyResponse,
    PostQuantumCryptoVerifyResponse: PostQuantumCryptoVerifyResponse,
    DescribeWhiteBoxDecryptKeyResponse: DescribeWhiteBoxDecryptKeyResponse,
    DescribeWhiteBoxDeviceFingerprintsResponse: DescribeWhiteBoxDeviceFingerprintsResponse,
    PostQuantumCryptoDecryptResponse: PostQuantumCryptoDecryptResponse,
    DisableDataKeysRequest: DisableDataKeysRequest,
    UpdateKeyDescriptionRequest: UpdateKeyDescriptionRequest,
    UnbindCloudResourceResponse: UnbindCloudResourceResponse,
    DescribeKeyResponse: DescribeKeyResponse,
    CancelKeyArchiveRequest: CancelKeyArchiveRequest,
    DisableKeyRotationRequest: DisableKeyRotationRequest,

}
